【问题标题】:Not able to create runnable jar for eclipse project无法为 Eclipse 项目创建可运行的 jar
【发布时间】:2012-11-01 09:15:06
【问题描述】:

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

我不确定我哪里出错了。谁能指出我犯了什么错误或者我是否需要更多的东西?

提前致谢。

【问题讨论】:

  • 这是使用 Maven 或 Ant 为您构建项目的好理由。
  • 发布您的确切失败消息“无效的标头字段”是否显示字段名称?
  • 我已经添加了失败信息。

标签: java eclipse shell terminal executable-jar


【解决方案1】:

JAR File Specification 可以在这里提供帮助。

我认为“无效标头字段”消息背后的问题是标头字段的值必须以空格开头;试试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。这样做的好处是罐子是完全独立的;缺点是它是一个更大的文件,更复杂,需要更多的时间来创建。您可以按照以下方式使用 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的清单。

【讨论】:

  • 好吧,这件事解决了,但现在我在修理那个罐子时遇到了问题。我正在使用以下代码运行 jar:java -jar myProject.jar 但我收到 classNotFound 错误
  • 我编辑了我的答案——我不确定你是否在没有我添加评论的情况下收到通知。
【解决方案2】:

通读jar manfile,我想你可以试试这样的:

jar cvmfe manifest.txt myProjecy.jar myProject bin/*.class lib/*.jar

myProject 是你的入口类名。如果这不起作用,请尝试完全删除-m 选项和manifest.txt,我猜-e 选项无论如何都应该占用MainClass 条目。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2015-02-06
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多