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
这意味着罐子或Eclispe的项目持有com.google.refine.operations.OnError
是你的编译时类路径,但不能在运行时类路径。
你知道我是如何得到它运行时类路径?通过执行spark-submit我可以设置--driver-class-path也许我必须在这里添加它,但我不知道如何,哪个文件等。 – progNewbie 2014-12-02 16:12:46
对不起,我不知道spark-submit。检查它的文档。会有东西添加到运行时类路径中。 – Nazgul 2014-12-02 16:14:40
好吧,无论如何,这非常有帮助! – progNewbie 2014-12-02 16:16:43
谢谢你:-)我会试试这个! – progNewbie 2014-12-03 03:18:10