可运行的 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