我在maven项目中创建了一些类,并使用IntelliJ IDEA工件创建了一个jar文件。这是项目的结构:
+ProjectName:
----src
-----main
------java
------A.B (packages)
--------DB
BP
SP
在创建jar文件时,我只包含了类BP。 在新项目中导入jar文件,并在main函数中运行以下简单代码:
import A.B.BP;
public class Test {
public static void main(String[] args) throws Exception {
BP temp = new BP("Test");
}
}
它构建没有错误,但我在运行时遇到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: A/B/BP
at Test.main(Test.java:8)
Caused by: java.lang.ClassNotFoundException: A.B.BP
我似乎在运行时的类路径中没有类。
点我对SP和DFS类做了同样的事情。我创建了一个jar文件并导入到一个新项目中,它运行时没有任何错误!
这是我的maven pom.xml 文件:
<dependency>
<groupId>com.datastax.spark</groupId>
<artifactId>spark-cassandra-connector_2.11</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>provided</scope>
</dependency>
我评论了其他类的依赖关系。
我该如何解决这个问题?
答案 0 :(得分:0)
这是因为运行时中缺少必需的依赖项。故事是,我在我当前的Maven项目的 pom.xml 文件中添加了spark-sql
依赖项。它隐含地需要一些其他的火花依赖,如spark-catalyst
,并将从Maven代表自动获取它们。因此,当我在当前项目中运行 Spark-SQL 代码时,它可以工作。当我将我的类构建为工件jar并尝试在另一个新项目中使用它们时,在导出的jar文件中它只包含spark-sql
依赖项,而不是其他嵌套依赖项,如spark-catalyst
!在编译时,Java刚刚检查了第一级依赖项,它看到spark-sql
已经提供,我的代码编译成功。但是在运行时除了第一级依赖之外,Java还需要嵌套的依赖项,如spark-catalyst
,并且它们没有提供!所以它导致了错误!除了fat jar之外,我还将这些嵌套的依赖项导入测试项目,它解决了错误!