我有一个名为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中:项目>>导出>> Runnable Jar文件)。
我设置" A2"作为"启动配置"中的主要类和#34;打包所需的库到生成的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"。
那么为什么会发生这种情况呢?我该如何制作" A1"在命令" java -cp MyTest.jar A1"?
中找到更新
我现在可以通过指定所需的jar文件来解决问题:
java -cp MyTest.jar:"/home/mosab/workspace/Hadoop Jars/Binaries/hadoop-common-2.7.3.jar" A1
如果你有一堆jar文件,你可以导出" Runnable Jar File"使用"将所需的库复制到生成的JAR旁边的子文件夹中#34;选项然后:
java -cp MyTest.jar:./MyTest_lib/* A1
注意: MyTest_lib是包含所有jar文件的文件夹
如果你想传递java选项,参数或包名,那么:
java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2
答案 0 :(得分:0)
要使A1工作,您需要在-cp中包含所有包含引用类的jar。它可能与您用于编译A1的jar列表相同。 在Windows上,列表由“;”分隔。在Linux上,列表由':'分隔。 您看到的错误是因为它无法找到A1引用的类文件。因此无法加载A1。
使用Hadoop.jar和Hadoop2.jar作为一般示例:
java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1