Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法为eclipse项目创建可运行jar_Java_Eclipse_Shell_Terminal_Executable Jar - Fatal编程技术网

Java 无法为eclipse项目创建可运行jar

Java 无法为eclipse项目创建可运行jar,java,eclipse,shell,terminal,executable-jar,Java,Eclipse,Shell,Terminal,Executable Jar,我已经在eclipse中创建了小型java应用程序。当我从IDE创建runnable 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 = myP

我已经在eclipse中创建了小型java应用程序。当我从IDE创建runnable 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)
java.io.IOException:头字段无效
位于java.util.jar.Attributes.read(Attributes.java:393)
位于java.util.jar.Manifest.read(Manifest.java:180)
位于java.util.jar.Manifest。(Manifest.java:50)
位于sun.tools.jar.Main.run(Main.java:149)
位于sun.tools.jar.Main.Main(Main.java:1147)
我不确定我会错在哪里。有人能指出我犯了什么错误,或者我是否需要更多的东西吗

提前谢谢。

您可以在此提供帮助

我认为“invalid header field”消息背后的问题是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

  • 将所有
    .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
    
    解压缩每个
    lib/*.jar
    文件后,会删除
    META-INF
    目录,这样
    unzip
    就不会询问是否要覆盖,也不会覆盖
    myProject.jar
    的清单

在这方面可以提供帮助

我认为“invalid header field”消息背后的问题是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

  • 将所有
    .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
    
    解压缩每个
    lib/*.jar
    文件后,会删除
    META-INF
    目录,这样
    unzip
    就不会询问是否要覆盖,也不会覆盖
    myProject.jar
    的清单


阅读jar manfile,我想您可以尝试以下方法:

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


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

通过jar manfile读取,我想您可以尝试如下操作:

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


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

这是使用Maven或Ant为您构建项目的一个很好的理由。发布您的确切失败消息“头字段无效”它说的是字段名吗?我已经添加了失败消息。这是使用Maven或Ant为您构建项目的一个很好的理由。发布准确的失败消息“无效的头字段”它说的是字段名吗?我已经添加了失败消息。好的,这件事已经解决了,但现在我在取消那个jar方面遇到了问题。我正在使用以下代码运行jar:java-jar myProject.jar,但我发现classNotFound错误我编辑了我的答案-我不确定你是否在没有我添加注释的情况下收到通知。好吧,这件事解决了,但现在我在取消那个jar方面遇到了问题。我使用以下代码来运行jar:java-jar myProject.jar,但是我得到了classNotFound错误我编辑了我的答案——我不确定你是否在没有我添加注释的情况下得到通知。