运行 java -jar 时包含外部 jar

Posted

技术标签:

【中文标题】运行 java -jar 时包含外部 jar【英文标题】:include external jar when running java -jar 【发布时间】:2011-02-24 00:06:34 【问题描述】:

根据我的阅读,当你执行如下命令时:

java -jar foo.jar

然后主类路径被忽略,类路径取自清单文件。

此外,命令行上声明的类路径也被忽略。所以在:

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

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

最后,我了解到清单文件在 jar 文件中只能包含相对路径。

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

【问题讨论】:

"注意:Class-Path 标头指向本地网络上的类或 JAR 文件,不是 JAR 文件中的 JAR 文件或可通过 Internet 协议访问的类。加载将 JAR 文件中的 JAR 文件中的类放入类路径中,您必须编写自定义代码来加载这些类。例如,如果 MyJar.jar 包含另一个名为 MyUtils.jar 的 JAR 文件,则不能在 MyJar 中使用 Class-Path 标头。 jar 的清单将 MyUtils.jar 中的类加载到类路径中。”来源:docs.oracle.com/javase/tutorial/deployment/jar/downman.html 【参考方案1】:

您可以在包含 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

【讨论】:

btw,如果你执行 java -cp /addtional/class/path -jar abcd.jar,额外的类路径不会被忽略。 你完全不知道我搜索了多久。谢谢。 如何将Class-Path 设置为我要编译的jar 内的jar? @Arin 据我所知,如果不编写自定义类加载器,这是不可能的。即便如此,基于一天半的长涨,这似乎是不可能的。请参阅上面的 AlikElzin-kilaka 评论和bugs.java.com/bugdatabase/view_bug.do?bug_id=4648386。当然你可以探索 One-Jar。【参考方案2】:

您是否有理由避免像这样调用主类

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

这种类型的调用允许您将绝对路径与相对路径混合使用。将其放入 shell 脚本或批处理文件中,以避免实际键入或记住完整的类路径以简化操作。

【讨论】:

+1 这个实用建议! Oracle/SUN 真的应该弃用 -jar 选项......这是一个反复出现的噩梦...... 在某些情况下使用-jar 可能会容易得多,但如果您发现简化选项给您带来麻烦,那么回退到让您完全控制的选项总是有意义的跨度> 我认为,Windows 上应该有一个分号,而不是 jar 路径之间的冒号。请检查这些答案***.com/a/219801/761755***.com/a/13018244/761755

以上是关于运行 java -jar 时包含外部 jar的主要内容,如果未能解决你的问题,请参考以下文章

将java添加到路径时,java.exe不被识别为内部或外部命令可运行程序或批处理文件

将外部 JS 引擎添加到 Eclipse 运行时以在 Java 15 中使用 Eclipse Java 编译器和 Ant 中的 <script>

如何连接外部程序

使用外部 UDF 库运行 BigQuery Standard SQL

java基础 --- 内部类

java基础 --- 内部类