【问题标题】:Jar execution error for package structure包结构的jar执行错误
【发布时间】:2019-08-18 17:08:14
【问题描述】:

我正在尝试创建一个 jar 并为包结构的 java 程序执行它。我能够创建 jar,但我正在执行它 抛出错误。

文件夹结构:Java_Example > pack > A.java

package pack;  
public class A{  
  public void msg(){System.out.println("Hello");}  
}

文件夹结构:Java_Example > mypack > B.java

package mypack;  
import pack.*;  

class B{  
  public static void main(String args[]){  
   A obj = new A();  
   obj.msg();  
  }  
}

文件夹结构:Java_Example > bin > Manifest.txt

Mainfest-Version: 1.1
Main-Class: mypack.B

清单文件与换行符一起存在

从命令行执行

E:\Java_Example\bin>java -cp E:\Java_Example mypack.B
Hello

创建罐子

E:\Java_Example\bin>jar cvf MyJar.jar Manifest.txt E:\Java_Example\pack\A.clas
E:\Java_Example\mypack\B.class
added manifest
adding: Manifest.txt(in = 60) (out= 61)(deflated -1%)
adding: Java_Example/pack/A.class(in = 376) (out= 268)(deflated 28%)
adding: Java_Example/mypack/B.class(in = 307) (out= 237)(deflated 22%)

执行jar

      E:\Java_Example\bin>jar -jar MyJar.jar
       Illegal option: j
Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] f
iles ...

java -jar 命令执行

E:\Java_Example\bin>java -jar MyJar.jar
no main manifest attribute, in MyJar.jar

尝试通过提供主类来执行 Jar

E:\Java_Example\bin>jar -cp MyJar.jar mypack.B
Illegal option: p
Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] f
iles ...

jar -tf 输出

E:\Java_Example\bin>jar -tf MyJar.jar
META-INF/
META-INF/MANIFEST.MF
Manifest.txt
Java_Example/pack/A.class
Java_Example/mypack/B.class

【问题讨论】:

  • manifest 文件应该在META-INF/MANIFEST.MF 下,你能检查一下生成的jar 看看是不是这样吗?
  • 试试java -jar MyJar.jar
  • @RJB: 可以看到创建的 MANIFEST.MF 文件,我已经编辑了问题并添加了 -tf 输出..
  • @LutzHorn: java -jar 也抛出错误,我已经编辑了问题并粘贴了命令及其输出
  • “没有主清单属性”表示文件META-INF/MANIFEST.MF 中没有Main-Class - 它与Manifest.txt 不同(位置错误,扩展名错误)。创建 jar 时添加 --main-class=mypack.B--manifest=Manifest.txtDocumentation

标签: java jar executable-jar


【解决方案1】:

您正在构建错误的 jar 文件。从基本文件夹执行此操作,并添加 m 选项以指定您在 jar 文件名之后列出清单文件(因为 fm 之前)。

E:\Java_Example>jar cvfm MyJar.jar bin\Manifest.txt pack\A.class mypack\B.class
added manifest
adding: pack/A.class(in = 376) (out= 268)(deflated 28%)
adding: mypack/B.class(in = 307) (out= 237)(deflated 22%)

如您所见,类文件现在是正确限定的,它没有说adding: Manifest.txt,因为该文件现在是manifest

现在你像这样运行它:

java -jar MyJar.jar

如果你想要 bin 文件夹中的 jar 文件,你当然只需要限定:

E:\Java_Example>jar cvfm bin\MyJar.jar bin\Manifest.txt pack\A.class mypack\B.class
E:\Java_Example>java -jar bin\MyJar.jar

【讨论】:

    【解决方案2】:

    您不能使用 jar 命令运行 jar,而是使用 java。对于您编辑的问题,清单不在正确的位置。查看 jar 提取的输出:

    E:\Java_Example\bin>jar -tf MyJar.jar
    META-INF/
    META-INF/MANIFEST.MF
    Manifest.txt
    Java_Example/pack/A.class
    Java_Example/mypack/B.class
    

    你不应该有Manifest.txt,清单是MANIFEST.MF

    【讨论】:

    • 已编辑问题,jar -jar 命令也抛出错误。粘贴有问题的错误
    猜你喜欢
    • 2014-12-18
    • 2017-01-14
    • 1970-01-01
    • 2016-12-30
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多