2017-03-04 79 views
0

我有一個名爲MyTest的項目。它有三大類:可運行JAR文件:實現「org.apache.hadoop.util.Tool」的類未找到

第一類實現工具界面(這是導致問題的類)爲簡單起見,我沒有空實現:

import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.util.Tool; 

public class A1 extends Configured implements Tool{ 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A1"); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

} 

第二類是一個普通的類:

public class A2 { 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A2"); 
    } 


} 

第三類也是一個普通的類:

public class A3 { 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A3"); 
    } 


} 

我將該項目導出爲「可運行Jar」(即,在Eclipse中:Project >> Export >> Runnable Jar文件)。

我設置爲「A2」,如「啓動配置」和「包裝所需的庫到生成JAR」,輸出罐子或「出口目的地」的名稱主類是「MyTest.jar」

現在如果我運行命令的預期:

java -jar MyTest.jar 

它會打印:

Hello A2 

如果我運行命令:

java -cp MyTest.jar A2 

它會打印:

Hello A2 

如果我運行命令:

java -cp MyTest.jar A3 

它會打印:

Hello A3 

現在的問題是,如果我運行命令:

java -cp MyTest.jar A1 

我會給這個錯誤:

Error: Could not find or load main class A1 

我嘗試了很多次,用不同的場景的問題是一樣的:當類實現了「org.apache.hadoop.util.Tool」界面那麼該課程將不會被找到。

請注意:如果我設置主類的JAR文件中的「啓動配置」爲「A1」,然後命令「Java的罐子MyTest.jar」將正常運行,並給出「你好A1」,但命令「java -cp MyTest.jar A1」仍然無法找到「A1」。

那麼爲什麼會發生這種情況?我怎樣才能在命令「java -cp MyTest.jar A1」中找到「A1」?

UPDATE:

我可以現在通過指定所需的jar文件來解決問題:

java -cp MyTest.jar:"/home/mosab/workspace/Hadoop Jars/Binaries/hadoop-common-2.7.3.jar" A1 

如果你有一大堆的jar文件可以導出「運行的JAR文件「與‘複製所需的庫到子文件夾下所產生的JAR’選項,然後:

java -cp MyTest.jar:./MyTest_lib/* A1 

注意: MyTest_lib是包含所有jar文件

的文件夾,如果你想通過Java的選項,參數或接包名稱:

java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2 

回答

0

爲了使A1工作,你需要包括所有在-cp中包含引用類的jar包。這可能與您用來編譯A1的jar列表相同。 在Windows上,列表由';'分隔。在Linux上,列表由':'分隔。 您看到的錯誤是因爲它無法找到A1引用的類文件。因此它不能加載A1。

使用Hadoop.jar和Hadoop2.jar一般例子:

java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1 
+0

感謝您的回覆,這工作,但這裏的問題該jar文件,我應該包括哪些內容?在我的項目中,我有一個使用jar文件中存在的一些類的主類,這些類爲其他jar文件等使用其他類。所以我應該包括所有的jar文件,即依賴jar和dependents的依賴者等。我有一個巨大的罐子清單是否有更好的方法來做到這一點。 –

+0

請注意:所有必需的罐子已經包裝在Runnable Jar File中,所以我怎樣才能以簡單的方式使用它們。此外,在「啓動配置」中指定的主類不需要指定任何依賴關係/ jar只是「java -jar MyTest.jar」,因爲我認爲所需的jar已經在MANIFEST.MF中提及,所以我可以使用MANIFEST。 MF文件告訴「java」命令爲任何主類添加這些罐子。 –

+0

我認爲你最好的選擇是重新創建A1作爲主類的jar文件,並使用java -jar MyTest.jar。當你創建你的Runnable Jar文件時,一個類被確定爲Main-Class。您可以在META-INF/MANIFEST.MF的jar文件中看到它。這就是java在使用「java -jar」時知道使用哪個類的主要類。 – ProgrammersBlock