Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用其他项目中的类提交java.lang.NoClassDefFoundError spark_Java_Eclipse_Maven_Apache Spark - Fatal编程技术网

使用其他项目中的类提交java.lang.NoClassDefFoundError spark

使用其他项目中的类提交java.lang.NoClassDefFoundError spark,java,eclipse,maven,apache-spark,Java,Eclipse,Maven,Apache Spark,我写了一些简单的spark java代码。 我使用maven在eclipse中编译它。然后从spark submit开始。一切正常 但现在我尝试使用Eclipse中另一个项目(不是maven项目)中的类。它是OpenRefine(谷歌精炼)。我还想使用一个json.jar,它是我在eclipse中添加到buildpath中的 所以我像这样导入它: import org.json.simple.parser.JSONParser; import com.google.refine.operatio

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

但现在我尝试使用Eclipse中另一个项目(不是maven项目)中的类。它是OpenRefine(谷歌精炼)。我还想使用一个json.jar,它是我在eclipse中添加到buildpath中的

所以我像这样导入它:

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可以在调用spark submit时添加此参数:

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

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

这意味着持有
com.google.refine.operations.OnError的jar或eclispe项目位于编译时类路径上,但不在运行时类路径上。

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

虽然spark documentation()建议您使用maven shade插件来生成包含所有依赖项的jar文件,但这对您的情况没有帮助,因为OpenRefine项目不使用maven

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

$ jar tf "<the jar file you created>"
...
com/google/refine/operations/OnError.class
...
$jar tf“”
...
com/google/refine/operations/OnError.class
...
包含类后,使用jar文件调用spark submit命令。Spark驱动程序和执行器可以在运行时类路径中找到它们

请注意,OpenRefine具有以下许可证。因此,只要您遵循源代码,就不禁止在项目中包含源代码。

您知道我是如何在运行时类路径上获得它的吗?通过执行spark submit,我可以设置驱动程序类路径,也许我必须在这里添加它,但我不知道如何添加,哪个文件等。很抱歉,我不知道spark submit。检查文档。在spark submit中尝试使用--jar选项,或者您可以简单地使用JavaSparkContext@ProgNewFagText的setJar方法在spark中添加jar,但它不是一个jar,我只是在Eclipse的另一个项目中有这个类。我将在jsonParser jar文件中尝试这个方法。但是其他的呢?@SachinJanani:太好了,json文件与--jars一起工作。但另一个仍然没有:-(