在运行Java -jar时包含外部jar文件

42

据我所知,当你执行以下命令:

java -jar foo.jar

那么主要的类路径将被忽略,而类路径将从清单文件中获取。

此外,命令行上声明的类路径也将被忽略。因此,在以下示例中:

java -classpath /usr/local/jar/foobar.jar -jar foo.jar

/usr/local/jar/foobar.jar被忽略。

最后,我读到过清单文件只能包含相对于jar文件的路径。

那么,如何在执行的jar文件中包含系统上存在但不在jar文件中的外部jar包的绝对路径?


4
注意:Class-Path头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或通过Internet协议可访问的类。要将JAR文件中的类加载到类路径中,您必须编写自定义代码来加载这些类。例如,如果MyJar.jar包含一个名为MyUtils.jar的另一个JAR文件,您不能使用MyJar.jar清单中的Class-Path头将MyUtils.jar中的类加载到类路径中。 - AlikElzin-kilaka
2个回答

46

你有避免直接调用主类的原因吗?

java -cp /usr/local/jar/foobar.jar:/some/other/path.jar com.your.main.classname

这种调用方式允许你混合使用绝对路径和相对路径。将其放入 shell 脚本或批处理文件中,避免实际输入或记住完整的类路径,以简化事情。


1
这是一条实用的建议,点赞!Oracle/SUN应该真正废弃-jar选项...它是一个反复出现的噩梦... - Andreas Dolk
4
在某些情况下,使用“-jar”选项可以更加方便,但如果你发现这种简化选项会给你带来麻烦,那么退而求其次选择能够让你完全掌控的选项就是明智的。 - matt b
1
我认为,在Windows上jar路径之间应该使用分号而不是冒号。请查看以下答案:https://dev59.com/aHVC5IYBdhLWcg3wqzHV#219801 和 https://dev59.com/YGcs5IYBdhLWcg3wPxge#13018244。 - GKalnytskyi

43

你可以在存放jar文件的文件夹中创建一个名为lib的文件夹。

Manifest.MF的内容可以是:

Main-Class: com.mastergaurav.test.app.MainClass
Class-Path: lib/one.jar lib/two.jar

文件夹内容:

mainFolder/
   * lib/one.jar
   * lib/two.jar
   * my-main.jar

执行:

java -jar my-main.jar

3
顺便提一句,如果你执行 java -cp /附加/类路径 -jar abcd.jar,附加的类路径不会被忽略。 - gvaish
3
你绝对不知道我为此寻找了多久。谢谢。 - Bogdan
我该如何将“Class-Path”设置为我想要编译的jar文件中的另一个jar文件? - Aaron Esau
1
据我所知,@Arin,如果没有编写自定义类加载器,这似乎是不可能的。即使如此,在一天半的尝试中也看似不可能。请参考AlikElzin-kilaka上面的评论和https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4648386。当然,你可以尝试使用One-Jar。 - Shea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接