我正在尝试打包一些java代码,这些代码引用了Java的Hadoop API。我正在我的PC上编写代码并将其移至CentOS VM然后进行编译。
出于某种原因,当我运行javac命令然后解压缩产品文件时,我的./META-INF/MANIFEST.MF
文件没有定义主类的行,例如“Main-Class:folder1.folder2.file” 。我相信这就是为什么我在尝试运行Hadoop.jar时“没有主要的清单属性”。
只需逐步完成整个过程,我就可以使用netbeans编写代码并导入Hadoop API .jar文件。保存后,我将Hadoop.java(这是除Hadoop API之外的唯一代码文件)文件上传到/usr/dan
目录中的VM。
从/usr/dan
我运行javac -classpath /usr/hadoop-0.20.2/hadoop-0.20.2-core.jar -d ./Hadoop ./Hadoop.java
,没有显示任何错误。
然后我使用jar cvf ./Hadoop.jar -c ./Hadoop/
创建jar文件。没有显示任何错误。
然后我尝试使用java -jar Hadoop.jar
运行jar文件并获取错误。
我需要将唯一重要的文件上传到VM .java文件吗?我在/usr/hadoop-0.20.2/hadoop-0.20.2-core.jar
中有Hadoop API jar文件?
执行javac命令后,API包含在.class文件中,我不再需要/usr/hadoop-0.20.2/hadoop-0.20.2-core.jar
,对吗?或者此文件是否需要保留在相对于.jar文件的某个路径中?
清单文件中没有定义Main方法的可能原因是什么?
非常感谢任何帮助,我整个周末一直在绞尽脑汁。
编辑:
默认情况下,清单几乎为空,如下所述:http://docs.oracle.com/javase/tutorial/deployment/jar/defman.html。我可以使用m
标志轻松地向清单文件添加条目。我的用法基于http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html。在我看来,这是在创建jar文件之后必须完成的事情,但是在最初震动文件时只需添加m
标志和相应的组件就可以一次性完成。
答案 0 :(得分:1)
如果您通过jar
命令创建jar并想要其他清单条目(例如Main-Class
),则需要使用m
选项
jar cmf manifest-file jar-file content-files
使用合适的清单文件(可以包含简单的清单输入行)。
答案 1 :(得分:0)
在hadoop中,没有必要执行Runnable Jar。 Hadoop提出了一个运行Jars的实用程序。您可以使用以下命令执行Jar,它不是Runnable(./META-INF/MANIFEST.MF中缺少Main类)
hadoop jar Hadoop.jar <PackageName>.<MainClassName> /input /output
如果您没有任何包,请使用以下命令
hadoop jar Hadoop.jar <MainClassName> /input /output