java - 可运行 JAR 文件 : Classes that implement "org.apache.hadoop.util.Tool" are not found

标签 java hadoop jar executable-jar mainclass

我有一个名为 MyTest 的项目。它分为三个类:

头等舱实现工具接口(interface)(这是导致问题的类)为简单起见,我做了空实现:

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 中:项目>>导出>>可运行 Jar 文件)。

我将“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”接口(interface)时,将找不到该类。

请注意:如果我在“启动配置”中将 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

最佳答案

要使 A1 工作,您需要在 -cp 中包含所有包含引用类的 jar。它可能与您用于编译 A1 的 jar 列表相同。
在 Windows 上,列表由 ';' 分隔。在 Linux 上,列表由 ':' 分隔。
您看到的错误是因为它找不到 A1 引用的类文件。因此它无法加载 A1。

使用 Hadoop.jar 和 Hadoop2.jar 作为一般示例:

java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1

关于java - 可运行 JAR 文件 : Classes that implement "org.apache.hadoop.util.Tool" are not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42594900/

相关文章:

java - 将仅编译时 jar 与 Maven 一起使用

java - 将异常从 Runnable 线程抛出到调用方法中

Java如何在使用命令行编译时添加库或API?

scala - pyspark簇yarn中的spark-sftp jar出现错误

Hadoop 机架感知配置

java - 从 jar 中获取文本并卡住

java - 我们如何在intellij idea项目中找到孤立的 jar

Java 类成员未在构造函数中初始化?

java - 我想为每次超过 x numOfErrors 的值添​​加 x 秒

hadoop - chmod : cannot access ‘/app/hadoop/tmp/mapred/staging/hduser896097807/. 分期/job_local89609780chmod: