可运行的 JAR 文件:未找到实现 "org.apache.hadoop.util.Tool" 的 类
Runnable JAR File: Classes that implement "org.apache.hadoop.util.Tool" are not found
我有一个名为 MyTest 的项目。它有三个 classes:
第一个 class 实现工具接口(这是导致问题的 class) 为简单起见,我做了空实现:
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;
}
}
第二个class是正常的class:
public class A2 {
public static void main(String[] args) throws Exception {
System.out.println("Hello A2");
}
}
第三个class也是正常的class:
public class A3 {
public static void main(String[] args) throws Exception {
System.out.println("Hello A3");
}
}
我将项目导出为 "Runnable Jar"(即在 Eclipse 中:项目>>导出>>可运行的 Jar 文件)。
我在"Launch Configuration"和"Packaged required libraries into generated JAR"中将"A2"设置为主class,输出jar或"export destination"的名称是"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
我试了很多次,在不同的场景下问题都是一样的:当class实现"org.apache.hadoop.util.Tool"接口时,class将找不到.
请注意: 如果我将 "Launch Configuration" 中的 jar 文件的主要 class 设置为 "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 文件,您可以使用 "Copy required libraries into a sub-folder next to the generated JAR" 选项导出 "Runnable Jar File",然后:
java -cp MyTest.jar:./MyTest_lib/* A1
注意: MyTest_lib是包含所有jar文件的文件夹
如果您想传递 java 选项、参数或包名称,则:
java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2
要使 A1 正常工作,您需要在 -cp 中包含所有包含引用的 classes 的 jar。它可能与您用于编译 A1 的 jar 列表相同。
在 Windows 上,列表由“;”分隔。在 Linux 上,列表由“:”分隔。
您看到的错误是因为它找不到 A1 引用的 class 文件。因此它无法加载 A1.
使用 Hadoop.jar 和 Hadoop2.jar 作为一般示例:
java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1
我有一个名为 MyTest 的项目。它有三个 classes:
第一个 class 实现工具接口(这是导致问题的 class) 为简单起见,我做了空实现:
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;
}
}
第二个class是正常的class:
public class A2 {
public static void main(String[] args) throws Exception {
System.out.println("Hello A2");
}
}
第三个class也是正常的class:
public class A3 {
public static void main(String[] args) throws Exception {
System.out.println("Hello A3");
}
}
我将项目导出为 "Runnable Jar"(即在 Eclipse 中:项目>>导出>>可运行的 Jar 文件)。
我在"Launch Configuration"和"Packaged required libraries into generated JAR"中将"A2"设置为主class,输出jar或"export destination"的名称是"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
我试了很多次,在不同的场景下问题都是一样的:当class实现"org.apache.hadoop.util.Tool"接口时,class将找不到.
请注意: 如果我将 "Launch Configuration" 中的 jar 文件的主要 class 设置为 "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 文件,您可以使用 "Copy required libraries into a sub-folder next to the generated JAR" 选项导出 "Runnable Jar File",然后:
java -cp MyTest.jar:./MyTest_lib/* A1
注意: MyTest_lib是包含所有jar文件的文件夹
如果您想传递 java 选项、参数或包名称,则:
java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2
要使 A1 正常工作,您需要在 -cp 中包含所有包含引用的 classes 的 jar。它可能与您用于编译 A1 的 jar 列表相同。 在 Windows 上,列表由“;”分隔。在 Linux 上,列表由“:”分隔。 您看到的错误是因为它找不到 A1 引用的 class 文件。因此它无法加载 A1.
使用 Hadoop.jar 和 Hadoop2.jar 作为一般示例:
java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1