使用artifacte jar中的类时,Spark Java java.lang.NoClassDefFoundError

时间:2018-06-11 12:49:49

标签: java maven apache-spark-sql

我在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>

我评论了其他类的依赖关系。

我该如何解决这个问题?

1 个答案:

答案 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之外,我还将这些嵌套的依赖项导入测试项目,它解决了错误!