我有一个名为 MyTest 的项目。它分为三个类:
第一个类实现了 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");
}
}
我将项目导出为“Runnable Jar”(即在 Eclipse 中:Project>>Export>>Runnable Jar File)。
我将“A2”设置为“启动配置”和“将所需库打包到生成的 JAR”中的主类,输出 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 -jar MyTest.jar”将正确运行并给出“Hello A1”,但命令“java -cp MyTest” .jar A1" 仍然无法找到 "A1"。
那么为什么会发生这种情况,如何在命令“java -cp MyTest.jar A1”中找到“A1”?
更新:
我现在可以通过指定所需的 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