【问题标题】:include external jar when running java -jar运行 java -jar 时包含外部 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

标签: java jar classpath manifest.mf


【解决方案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 路径之间的冒号。请检查这些答案stackoverflow.com/a/219801/761755stackoverflow.com/a/13018244/761755
猜你喜欢
  • 2013-06-08
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2013-08-08
  • 2013-08-16
相关资源
最近更新 更多