如何在hadoop上从javajar文件运行类?

tkqqtvp1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(353)

我有一个从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

它将myothermainclass视为jar的原始主类的“args”数组中的参数(而不是要运行的类)。
现在,如果您想在jar文件中运行另一个主类,您将键入什么?
我期望类似于:

hadoop java -cp MyTest.jar MyOtherMainClass arguments

但这给了:

Error: Could not find or load main class java

注意:如果我从“hadoopjava-cpmytest.jarmyothermainclass参数”中删除“hadoop”,它将正常启动

jtoj6r0c

jtoj6r0c1#

这个问题来自eclipse强制您在jar文件中设置主类,从而阻止您运行所需的类。您只需从jar文件的manifest.xml文件中删除main类,然后运行:

hadoop jar MyTest.jar MyOtherMainClass arguments

请看这里:http://www.roman10.net/2012/07/26/specify-the-main-class-in-a-jar-file-for-hadoop/
我键入了相同的文本,以防url被删除:
hadoop支持jar文件的执行。对于普通java执行中的可执行jar文件,可以在命令行中指定主类,如我在上一篇文章中所述:在jar文件中的主类之间切换。
但是,对于运行hadoop的可执行jar文件,规则有点不同。基本上以下规则适用(我在Hadoop1.0.3上测试过),
如果jar文件包含在其清单文件中指定的主类,则hadoop将获取该主类,即使命令指定了另一个主类。这与正常的java执行不同,在java执行中,我们可以指定一个主类来覆盖清单文件中的主类。如果jar文件在清单文件中不包含主类,hadoop允许我们指定主类。在eclipse中,当一个项目作为可运行jar文件导出时,它总是在启动配置时请求一个主类。
选定的主类将放在清单文件中。下面是我的helloworld项目中meta-inf/manifest.mf文件的内容,其中主类设置为helloworld。
清单版本:1.0类路径:。主类:hello.helloworld可以使用文件提取器浏览jar文件,使用文件编辑器打开清单文件,只需删除最后一行即可删除主类配置,并在提示时保存对jar文件的更改。这将创建一个没有主类的可运行jar文件。
修改后的jar文件可以在hadoop中使用,并带有用户提供的主类配置,如下面的示例命令所示,
$hadoop jar你好.jar你好.helloworld

相关问题