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

问题描述:

我写了一些简单的spark-java代码。 我使用maven在eclipse中进行编译。然后用spark-submit来启动它。一切正常。java.lang.NoClassDefFoundError spark-submit使用其他项目中的类

但现在我试图用一个类从Eclipse中的另一个项目(这是毫无Maven项目)。这是OpenRefine(googlerefine)。而且我想使用一个json.jar,我将它添加到eclipse中的构建路径中。

于是我进口这样的:

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给我“建立成功”。

但在运行它时我得到这个错误:

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对我的作品有来电时添加此参数火花提交:

--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文件被创建,就可以确认它包含在它OpenRefine类火花提交作业之前:

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

一旦它包括的类,叫火花提交与jar文件命令。 Spark驱动程序和执行程序可以在运行时类路径中找到它们。这OpenRefine有以下许可证

注意。因此,只要你遵守它,它并不禁止将源代码包含到你的项目中。 https://github.com/OpenRefine/OpenRefine/blob/master/LICENSE.txt

+0

谢谢你:-)我会试试这个! – progNewbie 2014-12-03 03:18:10

这意味着罐子或Eclispe的项目持有com.google.refine.operations.OnError是你的编译时类路径,但不能在运行时类路径。

+0

你知道我是如何得到它运行时类路径?通过执行spark-submit我可以设置--driver-class-path也许我必须在这里添加它,但我不知道如何,哪个文件等。 – progNewbie 2014-12-02 16:12:46

+0

对不起,我不知道spark-submit。检查它的文档。会有东西添加到运行时类路径中。 – Nazgul 2014-12-02 16:14:40

+0

好吧,无论如何,这非常有帮助! – progNewbie 2014-12-02 16:16:43