2017-03-04 78 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