我在 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
当我运行此命令时,我收到无效的 header 字段。以下是完整的错误消息。
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)
我不知道我哪里出了问题。谁能指出我犯了什么错误或者我是否需要更多的东西?
提前致谢。
最佳答案
JAR File Specification可以在这里提供帮助。
我认为“无效 header 字段”消息背后的问题是 header 字段的值必须以空格开头;尝试包含 manifest.txt
Main-Class: myProject
相反。
至于访问lib/*.jar
文件中的类,Java不会在jar文件中查找jar文件中的类——您实际上可以跳过在jar
命令行上指定lib/*.jar
。
这里有两种可能性:
添加
Class-Path: lib/lib1.jar lib/lib2.jar lib/lib3.jar
到
manifest.txt
。这样做的缺点是,如果您分发 jar 并且库 jar 不在正确的相对路径中,则会出现 ClassNotFoundError。将
lib/*.jar
中的所有.class
文件解压到临时目录中,并将它们添加到myProject.jar
中。这样做的优点是 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
解压每个
lib/*.jar
文件后都会删除META-INF
目录,这样unzip
就不会询问是否覆盖,也不会覆盖myProject.jar
的 list 。
关于java - 无法为 Eclipse 项目创建可运行的 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352333/