4

我有一个从 Eclipse 导出的 jar 文件(可运行的 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

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

4

1 回答 1

3

问题来自 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/

如果 url 被删除,我输入了相同的文本:

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

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

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

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

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

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

$ hadoop jar hello.jar hello.HelloWorld

于 2017-03-25T15:48:42.450 回答