Java 可运行JAR文件:实现;org.apache.hadoop.util.Tool“;找不到

Java 可运行JAR文件:实现;org.apache.hadoop.util.Tool“;找不到,java,hadoop,jar,executable-jar,mainclass,Java,Hadoop,Jar,Executable Jar,Mainclass,我有一个项目叫MyTest。它有三类: 第一个类实现工具接口(这是导致问题的类)为简单起见,我做了空实现: 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 {

我有一个项目叫MyTest。它有三类:

第一个类实现工具接口(这是导致问题的类)为简单起见,我做了空实现:

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");
    }


}
第三类也是普通类:

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

我在“启动配置”和“将所需库打包到生成的JAR”中设置了“A2”作为主类,输出JAR或“导出目的地”的名称是“MyTest.JAR”

现在,如果我运行命令,则与预期一样:

java -jar MyTest.jar
java -cp MyTest.jar A2
java -cp MyTest.jar A3
它将打印:

Hello A2
Hello A2
Hello A3
如果我运行命令:

java -jar MyTest.jar
java -cp MyTest.jar A2
java -cp MyTest.jar A3
它将打印:

Hello A2
Hello A2
Hello A3
如果我运行命令:

java -jar MyTest.jar
java -cp MyTest.jar A2
java -cp MyTest.jar A3
它将打印:

Hello A2
Hello A2
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-cpmytest.jar 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文件,您可以使用“将所需库复制到生成的jar旁边的子文件夹”选项导出“可运行jar文件”,然后:

java -cp MyTest.jar:./MyTest_lib/* A1
注意:MyTest\u 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

谢谢你的回复,这很有效,但是这里的问题是我应该包括哪些jar文件?在我的项目中,我有一个主类,它使用jar文件中存在的一些类,这些类使用其他类来处理其他jar文件,以此类推。因此,我应该包括所有jar文件,即从属jar和从属jar的从属文件等。我有一个庞大的jar列表,有没有更好的方法可以做到这一点。请注意:所有需要的jar都已打包在可运行jar文件中,因此我如何轻松地使用它们。另外,“launch configuration”中指定的主类不需要指定任何依赖项/jar,只需指定“java-jar MyTest.jar”,因为我认为MANIFEST.MF中已经提到了所需的jar,所以我可以使用MANIFEST.MF文件告诉“java”命令为任何主类包含这些jar。我认为最好的方法是使用A1作为主类重新创建jar文件,并使用java-jar MyTest.jar。创建可运行Jar文件时,一个类被标识为主类。您可以在META-INF/MANIFEST.MF的jar文件中看到这一点。这就是java在使用“java-jar”时如何知道哪个类是要使用的主类。是的,这是对的,但我的意思是,如果我有很多主类,我如何克服这个问题(指定所有的jar)?