2012-06-11 70 views
0

我得到一個classnotfound異常。聲稱未找到的類不存在,但類名稱被設置爲我的地圖縮減作業的輸入文件列表的路徑。Hadoop:奇怪ClassNotFoundException

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等等

SOLUTION:

jar cmf [manifest_file] [jar_name.jar] -C [folder_of_classes] [path_for_jar_file] 

它會合並在JAR檔案生成的清單文件中的manifest_file的內容。包括在manifest_file Main-Class的下面一行:[Name_Of_Class]

回答

2

不管是不是有一個包層次(如果沒有,你做錯了什麼)你仍然需要給它的包含main的類的名稱。

例如,the docs有一個例子,其中主類是org.myorg.WordCount

bin/hadoop jar /usr/joe/wordcount.jar WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output 

我會假設你也可以在清單中指定作爲主類:即使WordCount是默認的包,它應該如果jar文件不包括在清單主類指定與任何罐子;在相同的文檔中,類參數顯示爲可選。

+0

是的,問題是我沒有任何在jar參數後鍵入WordCount的選項。我如何在清單文件中指定它?由於只有外部類和主要方法,它不會自己指定嗎? – Bob

+0

@Bob不,JVM不會掃描類路徑上的所有類,以查看是否只有一個具有'psvm'。你是什​​麼意思你「沒有任何選擇」來包括一個班級?有關詳細信息,請參見[Jar文件規範](http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html),特別是[Main-Class](http:// docs .oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Main%20Attributes)條目。 –

+0

我在使用一個特定的工具,它要求清單文件包含主要的類信息。 – Bob