如何在Hadoop上运行java jar文件中的类?

时间:2017-03-25 14:58:38

标签: eclipse hadoop jar classpath mainclass

我有一个从Eclipse导出的jar文件(Runnable JAR>>将所需的库复制到子文件夹中)。

在java中,如果在manifest.xml中设置主类,则可以运行:

java -jar MyTest.jar arguments

如果要在jar文件中运行另一个主类,或者如果未在manifest.xml中设置主类,则可以运行:

java -cp MyTest.jar MyOtherMainClass arguments

在Hadoop中,如果在manifest.xml中设置了主类,则可以运行:

hadoop jar MyTest.jar arguments

如果输入:

hadoop jar MyTest.jar MyOtherMainClass arguments

它会将原始主类jar的“args”数组中的MyOtherMainClass视为参数(而不是要运行的类)。

现在,如果你想在jar文件中运行另一个主类,你会输入什么?

我期待类似的东西:

hadoop java -cp MyTest.jar MyOtherMainClass arguments

但是这给了:

Error: Could not find or load main class java

注意:如果我从“hadoop java -cp MyTest.jar MyOtherMainClass参数”中删除“hadoop”,它将正常启动

1 个答案:

答案 0 :(得分:1)

问题来自Eclipse强制您在jar文件中设置主类,因此阻止您运行所需的类。您所要做的就是从jar文件的manifest.xml文件中删除主类并运行:

hadoop jar MyTest.jar MyOtherMainClass arguments

看看这里: http://www.roman10.net/2012/07/26/specify-the-main-class-in-a-jar-file-for-hadoop/

我输入相同的文字,以防网址被删除:

Hadoop支持执行jar文件。对于普通java执行中的可执行jar文件,可以在命令行中指定主类,如我之前的帖子所述:在jar文件中的主类之间切换。

但是,使用hadoop运行的可执行jar文件的规则有点不同。基本上遵循以下规则(我在Hadoop 1.0.3上测试过),

如果jar文件包含在其清单文件中指定的主类,则即使命令指定另一个主类,hadoop也将使用主类。这与普通的java执行不同,我们可以指定一个主类来覆盖清单文件中的主类。 如果jar文件不包含清单文件中的主类,则hadoop允许我们指定主类。 在eclipse中,当一个项目作为runnable jar文件导出时,它总是在Launch配置中要求一个主类。

选择的主类将放在清单文件中。以下是我的helloworld项目中META-INF / MANIFEST.MF文件的内容,其中主类设置为HelloWorld。

清单 - 版本:1.0 类路径:。 Main-Class:hello.HelloWorld 可以使用文件提取器浏览jar文件,使用文件编辑器打开清单文件,只需删除最后一行以删除主类配置,并在提示时将更改保存到jar文件。这将创建一个没有主类的可运行jar文件。

然后可以在Hadoop中使用修改后的jar文件和用户提供的主类配置,如下面的示例命令所示,

$ hadoop jar hello.jar hello.HelloWorld