我有一个名为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
感谢您的回复,这工作,但这里的问题该jar文件,我应该包括哪些内容?在我的项目中,我有一个使用jar文件中存在的一些类的主类,这些类为其他jar文件等使用其他类。所以我应该包括所有的jar文件,即依赖jar和dependents的依赖者等。我有一个巨大的罐子清单是否有更好的方法来做到这一点。 –
请注意:所有必需的罐子已经包装在Runnable Jar File中,所以我怎样才能以简单的方式使用它们。此外,在“启动配置”中指定的主类不需要指定任何依赖关系/ jar只是“java -jar MyTest.jar”,因为我认为所需的jar已经在MANIFEST.MF中提及,所以我可以使用MANIFEST。 MF文件告诉“java”命令为任何主类添加这些罐子。 –
我认为你最好的选择是重新创建A1作为主类的jar文件,并使用java -jar MyTest.jar。当你创建你的Runnable Jar文件时,一个类被确定为Main-Class。您可以在META-INF/MANIFEST.MF的jar文件中看到它。这就是java在使用“java -jar”时知道使用哪个类的主要类。 – ProgrammersBlock