java - 无法为 Eclipse 项目创建可运行的 jar

标签 java eclipse shell terminal executable-jar

我在 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/

相关文章:

android - 如何在 Eclipse 中正确安装 mysql 连接器?

Linux shell 编程。实现搜索、查找和替换技术

linux - Linux 中的恢复脚本

linux - 在一个月内将调用从 bash 脚本更改为一周

java - 检测鼠标指针消失

java - Spring Security无法加载资源: the server responded with a status of 404

java - GAE : Exception while allocating 16 digit ids

java - 他到底如何调试这样一个正在运行的应用程序,更重要的是,我该如何调试?

java - 如何在Eclipse中搜索文件及文件内容?

java - 如何在SWT java中在 Canvas 内的图像上绘制带边框的透明复合 Material