Spark/Java: GSON 依赖项中的 NoClassDefFoundError
Spark/Java: NoClassDefFoundError in GSON dependency
我有一个使用 JAR 文件的小型 Spark 项目,我正在使用 Maven 对其进行打包。
我正在使用 GSON 处理 JSON 文件,我特别需要 JsonReader class.
我添加了 GSON 依赖项,当我 运行 它作为标准 Java 项目时它工作正常。但是,当我将它打包并 运行 在 Spark 中时,它会抱怨:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/stream/JsonReader
这是有问题的行:
reader = new JsonReader(new InputStreamReader(new FileInputStream(
jsonfile)));
我确实导入了它:
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
这是我的 POM 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SWETesting</groupId>
<artifactId>SWETesting</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source/>
<target/>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
我什至在我的发行版中安装了 libgoogle-gson,但这没有帮助。
这里有什么问题?
编辑:我在使用 Maven 构建作业后以独立模式提交作业:
mvn package
/home/chris/Tools/spark-1.2.1/bin/spark-submit --class PlagiarismCheck --master local[6] target/SWETesting-0.0.1-SNAPSHOT.jar > output.txt
好像是指旧版本的jar。 gson jar 旧版本 1.5 没有包名流。检查 maven 依赖树并查找是否存在任何旧版本的 gson jar。如果是,请清理项目/删除存储库中的 jars
检查maven依赖树的命令
C:\Projects\Project_name>mvn dependency:tree
问题是您的项目依赖项未包含在 SWETesting-0.0.1-SNAPSHOT.jar
中,因此出现错误。您可以使用 maven-assembly plugin or similar, that should fix the issue. You can find an example here.
生成一个胖罐子
我有一个使用 JAR 文件的小型 Spark 项目,我正在使用 Maven 对其进行打包。
我正在使用 GSON 处理 JSON 文件,我特别需要 JsonReader class.
我添加了 GSON 依赖项,当我 运行 它作为标准 Java 项目时它工作正常。但是,当我将它打包并 运行 在 Spark 中时,它会抱怨:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/stream/JsonReader
这是有问题的行:
reader = new JsonReader(new InputStreamReader(new FileInputStream(
jsonfile)));
我确实导入了它:
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
这是我的 POM 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SWETesting</groupId>
<artifactId>SWETesting</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source/>
<target/>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
我什至在我的发行版中安装了 libgoogle-gson,但这没有帮助。
这里有什么问题?
编辑:我在使用 Maven 构建作业后以独立模式提交作业:
mvn package
/home/chris/Tools/spark-1.2.1/bin/spark-submit --class PlagiarismCheck --master local[6] target/SWETesting-0.0.1-SNAPSHOT.jar > output.txt
好像是指旧版本的jar。 gson jar 旧版本 1.5 没有包名流。检查 maven 依赖树并查找是否存在任何旧版本的 gson jar。如果是,请清理项目/删除存储库中的 jars
检查maven依赖树的命令
C:\Projects\Project_name>mvn dependency:tree
问题是您的项目依赖项未包含在 SWETesting-0.0.1-SNAPSHOT.jar
中,因此出现错误。您可以使用 maven-assembly plugin or similar, that should fix the issue. You can find an example here.