我在eclipse中创建了小型java应用程序。当我从IDE创建可运行的jar时,一切正常。但不知怎的,我无法通过终端创建它(假设我正在使用Mac)。
以下是我的项目目录结构
./bin (Contains all compiled classes)
./lib (Contains all the third party lib I am using lib1.jar,lib2.jr, lib3.jar)
./src (Contains my java class = myProject.java)
manifest.txt (Contains 2 line, first line is Main-Class:myProject and second line is empty)
以下是我用来编译我的类的命令
javac -d bin -sourcepath src -cp lib/lib1.jar:lib/lib2.jar:lib/lib3.jar src/myProject.java
要创建jar文件,我使用以下命令
jar cvfm myProject.jar manifest.txt bin/*.class lib/*.jar
当我运行此命令时,我收到无效的标题字段。以下是完整的错误消息。
java.io.IOException: invalid header field
at java.util.jar.Attributes.read(Attributes.java:393)
at java.util.jar.Manifest.read(Manifest.java:180)
at java.util.jar.Manifest.<init>(Manifest.java:50)
at sun.tools.jar.Main.run(Main.java:149)
at sun.tools.jar.Main.main(Main.java:1147)
我不确定我哪里出错了。任何人都可以指出我正在犯的错误,或者我是否需要更多的东西?
提前致谢。
答案 0 :(得分:1)
JAR File Specification可以在这里提供帮助。
我认为“无效标题字段”消息背后的问题是标题字段的值必须以空格开头;尝试manifest.txt
包含
Main-Class: myProject
代替。
至于访问lib/*.jar
文件中的类,Java将无法在jar文件中的jar文件中找到类 - 您实际上可以跳过在lib/*.jar
命令行上指定jar
。
以下是两种可能性:
添加
Class-Path: lib/lib1.jar lib/lib2.jar lib/lib3.jar
到manifest.txt
。这样做的缺点是,如果您分发jar并且库jar不在正确的相对路径上,则会出现ClassNotFoundError。
将.class
内的所有lib/*.jar
文件解压缩到临时目录中,并将其添加到myProject.jar
。这样做的好处是罐子是完全独立的;缺点是它是一个更复杂的文件,需要更多的时间来创建。您可以沿着这些行使用shell脚本:
mkdir lib/expanded
cd lib/expanded
for J in ../*.jar; do
unzip "${J}"
rm -rf META-INF
done
zip -R ../../myProject.jar *
cd .. && rm -rf expanded
在提取每个META-INF
文件后删除lib/*.jar
目录,以便unzip
不会询问是否覆盖,并且不会覆盖{{1}的清单}}
答案 1 :(得分:0)
通过jar文件阅读,我想你可以尝试这样的事情:
jar cvmfe manifest.txt myProjecy.jar myProject bin/*.class lib/*.jar
myProject
是您的入门级名称。如果这不起作用,请尝试完全删除-m
选项和manifest.txt
,我认为-e
选项应该采用MainClass条目。