java.lang.NoClassDefFoundError Spark-submit 使用其他项目中的类

标签 java eclipse maven apache-spark

我写了一些简单的spark-java代码。 我在eclipse中使用maven编译。然后用spark-submit启动它。一切正常。

但现在我尝试使用 Eclipse 中另一个项目(不是 Maven 项目)中的类。它是OpenRefine(googlerefine)。我还想使用我添加到 eclipse 中的构建路径的 json.jar。

所以我像这样导入它:

import org.json.simple.parser.JSONParser;
import com.google.refine.operations.OnError; //form other project
import com.google.refine.operations.cell.TextTransformOperation; //from other project

并且 Eclipse 不会将其标记为错误。使用 Maven 编译还给了我“BUILD SUCCESS”。

但是运行时出现此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/refine/operations/OnError
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
    at java.lang.Class.getMethod0(Class.java:2774)
    at java.lang.Class.getMethod(Class.java:1663)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:325)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: com.google.refine.operations.OnError
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.sec

当使用 com.google.refine.operations.OnError 删除我的代码时,我在 JSONParser 中遇到了相同的错误。

有人可以帮助我吗?我不知道该怎么办

编辑:现在 json.jar 可以为我工作,在调用 Spark-submit 时添加此参数:

--jars /path/to/json-simple-1.1.jar

其他类不是 .jar 文件。我想知道是否可以将它们添加到运行时类路径中,或者我是否必须构建自己的 .jar 文件,这将非常棘手。因为openRefine是一个大项目,我不知道如何获取jar。

最佳答案

解决方案是将所有 OpenRefine Java 源代码 (OpenRefine/main/src) 包含到您的 Maven 项目的 src 目录中,并创建一个包含 OpenRefine 的 jar 文件。

虽然 Spark 文档 ( link ) 建议您使用 maven-shade-plugin 生成包含所有依赖项的 jar 文件,但它对您的情况没有帮助,因为 OpenRefine 项目不使用 maven。

创建 jar 文件后,您可以在提交 Spark 作业之前确认其中包含 OpenRefine 类:

$ jar tf "<the jar file you created>"
...
com/google/refine/operations/OnError.class
...

包含类后,使用 jar 文件调用 Spark-submit 命令。 Spark 驱动程序和执行程序可以在运行时类路径中找到它们。

请注意,OpenRefine 具有以下许可证。所以只要你遵循它,并不禁止将源代码包含到你的项目中。 https://github.com/OpenRefine/OpenRefine/blob/master/LICENSE.txt

关于java.lang.NoClassDefFoundError Spark-submit 使用其他项目中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253690/

相关文章:

java - 如何在面向 JavaEE 开发人员的 Eclipse 4.4 版中禁用 APT Web 服务验证

java - 基于 Maven 配置文件的 web.xml 配置

plugins - 带有ssl问题的Weblogic maven插件

java - Ignite CacheStore 实现在服务器端抛出 ClassNotFoundException

java - 使用 Spring Boot 和并行流发送电子邮件

java - Java Concurrency In Practice 中的 CountDownLatch 示例

java - 在 Eclipse Maven 项目中更改动态 Web 模块版本

android - Eclipse 找不到 android.webkit.WebSettings.PluginState;

javax.enterprise.inject.Vetoed 打开 web beans,哪个 jar?

java - 我应该如何本地化数据库中始终必须为英文的系统字符串?