当前位置: 首页 > 面试题库 >

带有杂物的可执行Jar

姚才捷
2023-03-14
问题内容

我正在尝试从命令行构建一个可执行jar(我不想使用ant或OneJar)。这是我的file.jar的内容:

jar tvf file.jar
     0 Mon Sep 20 17:16:12 CEST 2010 lib/
 45396 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.logging_1.0.4.v201005080501.jar
321330 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar
 55003 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar
     0 Mon Sep 20 19:15:00 CEST 2010 META-INF/
   265 Mon Sep 20 19:12:44 CEST 2010 META-INF/MANIFEST.MF
530609 Mon Sep 20 17:16:12 CEST 2010 ped.jar

META-INF / MANIFEST.MF的内容:

Manifest-Version: 1.0
Class-Path: ped.jar lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar lib/org.apache.commons.logging_1.0.4.v201005080501.jar
Main-Class: fr.inserm.umr915.bomcat.ped.PedigreeDrawer

ped.jar确实包含Main-Class

jar tvf ped.jar | grep PedigreeDrawer.class
 39541 Mon Sep 20 17:16:10 CEST 2010 fr/inserm/umr915/bomcat/ped/PedigreeDrawer.class

但是当我尝试执行file.jar时,出现错误:

java -jar file.jar
Exception in thread "main" java.lang.NoClassDefFoundError: fr/inserm/umr915/bomcat/ped/PedigreeDrawer
Caused by: java.lang.ClassNotFoundException: fr.inserm.umr915.bomcat.ped.PedigreeDrawer
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

所以,我在这里错过了一些东西。我不能仅通过包含依赖项来打包可执行jar吗?

谢谢你的帮助

皮埃尔


问题答案:

如前所述,Class-Path:属性中的jar 是相对于jar文件的位置而不是jar文件内部的。这可能是Java本来要运行applet的日子的残余。

您需要使用maven uberjar之类的工具将所有需要的类一起放在一个jar中,以创建一个独立的可执行jar。

当然,如果您绝对希望避免使用工具,也可以只将所有jar文件解压缩到一个目录中,添加META-INF并进行清单,然后再次压缩所有内容。



 类似资料:
  • 我已经浏览了Stackoverflow一整天,寻找如何做到这一点,但我还没有成功 我正在将我制作的一个快速游戏打包成一个可执行的jar,但我没有正确地引用图像,我只是引用了文件 我的类在src default package中,我不确定应该在哪里添加映像,或者是否必须将映像添加到构建路径中,或者在最新版本的eclipse中将映像添加到构建路径中的正确方法

  • 我有一个mvn项目,它包含对apache Commons-Lang3的依赖。我设法为这个jar文件生成了一个manifest.mf,它通过我的远程服务器上的java-jar.jar启动。然而,它不包括任何依赖项,我不知道为什么。 您可以看到,它正确地将依赖关系解析为commons-lang并将其放入清单中。但实际文件不见了。 有人知道为什么吗?

  • 提前感谢你的所有帮助。

  • 问题内容: 我在Spring(3.1)中使用以下@Cacheable: Spring: Maven: 要缓存的方法: las,当我调试代码时,我看到即使param1和param2相同(即未使用cahce),也多次调用了该缓存方法。 有任何想法吗? 问题答案: 密钥显示不正确- 您可能是说- 此外,如果在没有调试信息的情况下完成编译,则param1,param2参数名称将对表达式求值器不可用。相反,

  • 我有一个命令,我需要在java中按照以下方式运行: 当路径没有空格时,这个命令可以正常工作,但是当我有空格时,我似乎无法让它工作。我尝试了以下方法,运行Java1.7 以及;以及 但两人似乎都没有采取任何行动。有没有想过我做错了什么??

  • 问题内容: 我有一条命令需要在Java中按照以下方式运行: 当路径没有空格时,此命令可以正常工作,但是当我有空格时,似乎无法正常工作。我尝试了以下事情,运行Java 1.7 以及 但是似乎两者都没有做任何事情。关于我在做什么错的任何想法吗? 问题答案: 传递给命令的每个参数都应该是一个单独的String元素。 所以你的命令数组应该看起来更像是… 现在,每个元素将在程序变量中显示为单独的元素 我也极