我得到一个 classnotfound 异常。声称未找到的类不存在,但类名设置为我的 map reduce 作业的输入文件列表的路径。
INFO server Running: /usr/lib/hadoop/bin/hadoop --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf jar tmp.jar /user/hduser/datasets/ /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20
Exception in thread "main" java.lang.ClassNotFoundException: /user/hduser/datasets/
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(Runjar.java:190)
正如我们所见,/user/hduser/datasets/
是输入文件的路径。为什么我会收到此错误ClassNotFoundException
?为什么它把它看作一个类?
我发现了自己的错误。我有一个包结构。我需要指定我的包裹信息
/usr/lib/hadoop/bin/hadoop
--config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf
jar tmp.jar org.myorg.tmp /user/hduser/datasets/
/user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20
在我的工具中,没有将包作为参数提供给 Java 的选项。所以我需要没有包装。但是由于缺少此输入文件路径之前的参数,因此出现以下错误。
我的课程直接在其根目录下的 tmp.jar 中。我的意思是没有 org.myorg 等...
解决方案:
jar cmf [manifest_file] [jar_name.jar] -C [folder_of_classes] [path_for_jar_file]
它将 manifest_file 的内容与 jar 存档中生成的清单文件合并。在 manifest_file Main-Class 中包含以下行:[Name_Of_Class]