runnable jar文件:找不到实现“org.apache.hadoop.util.tool”的类

enyaitl3  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(491)

我有一个叫做mytest的项目。它有三个类:
第一个类实现工具接口(这是导致问题的类)为了简单起见,我做了空实现:

  1. import org.apache.hadoop.conf.Configured;
  2. import org.apache.hadoop.util.Tool;
  3. public class A1 extends Configured implements Tool{
  4. public static void main(String[] args) throws Exception {
  5. System.out.println("Hello A1");
  6. }
  7. @Override
  8. public int run(String[] args) throws Exception {
  9. // TODO Auto-generated method stub
  10. return 0;
  11. }
  12. }

第二节课是普通课:

  1. public class A2 {
  2. public static void main(String[] args) throws Exception {
  3. System.out.println("Hello A2");
  4. }
  5. }

第三节课也是普通课:

  1. public class A3 {
  2. public static void main(String[] args) throws Exception {
  3. System.out.println("Hello A3");
  4. }
  5. }

我将项目导出为“runnable jar”(即在eclipse:project>>export>>runnable jar文件中)。
我在“launch configuration”和“packaged required libraries into generated jar”中设置了“a2”作为主类,输出jar或“export destination”的名称是“mytest.jar”
现在,如果我运行命令:

  1. java -jar MyTest.jar

它将打印:

  1. Hello A2

如果我运行命令:

  1. java -cp MyTest.jar A2

它将打印:

  1. Hello A2

如果我运行命令:

  1. java -cp MyTest.jar A3

它将打印:

  1. Hello A3

现在的问题是,如果我运行命令:

  1. java -cp MyTest.jar A1

我将给出以下错误:

  1. Error: Could not find or load main class A1

我尝试过很多次,在不同的场景中问题是相同的:当类实现“org.apache.hadoop.util.tool”接口时,将找不到该类。
请注意:如果我在“launch configuration”中将jar文件的主类设置为“a1”,那么命令“java-jar mytest.jar”将正确运行并给出“hello a1”,但是命令“java-cp mytest.jar a1”仍然无法找到“a1”。
那么,为什么会发生这种情况,如何在命令“java-cpmytest.jar a1”中找到“a1”?
更新:
我现在可以通过指定所需的jar文件来解决这个问题:

  1. java -cp MyTest.jar:"/home/mosab/workspace/Hadoop Jars/Binaries/hadoop-common-2.7.3.jar" A1

如果你有一堆jar文件,你可以导出“runnable jar file”和“copy required libraries into a sub folder next the generated jar”选项,然后:

  1. java -cp MyTest.jar:./MyTest_lib/* A1

注意:mytest\u lib是包含所有jar文件的文件夹
如果要传递java选项、参数或包名,则:

  1. java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2
3b6akqbq

3b6akqbq1#

要使a1正常工作,需要在-cp中包含所有包含引用类的jar。这可能与编译a1时使用的jar列表相同。在windows上,列表由“;”分隔。在linux上,列表由“:”分隔。您看到的错误是因为它找不到a1引用的类文件。因此无法加载a1。
使用hadoop.jar和hadoop2.jar作为一般示例:

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

相关问题