我有一个从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”,它将正常启动
答案 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