【问题标题】:Run an executable jar throw ClassNotFoundException运行一个可执行的 jar throw ClassNotFoundException
【发布时间】:2013-11-18 20:45:01
【问题描述】:

我的jar文件中的目录是这样的:

remote.jar

 -com
 -lib
 -META-INF

META-INF下是文件MANIFEST.MF

Manifest-Version: 1.0
Class-Path: lib/*
Main-Class: com.xx.xx.Main

所有 jars 都在 lib 文件夹下。

当我从命令行运行java -jar remote.jar 时,它给了我ClassNotFoundException,找不到的类位于lib 文件夹下的一个罐子中。如果 main 函数没有引用 lib 中的任何类,则命令行运行没有问题。

我的问题是为什么它在 lib 下的 jars 中找不到类。

编辑:

lib文件夹下没有嵌套文件夹

【问题讨论】:

  • 附注:您的标题不正确
  • 尝试将类路径更改为./lib/
  • @Choc13 不行,我试过了。
  • 我已经成功地创建了一个可执行 jar 引用第三方 jar 在 Eclipse 中使用导出。然后 Eclipse 为我处理了 MANIFEST.MF 的创建,并添加了必要的东西来从 jar 中加载 jar。

标签: java


【解决方案1】:

问题在于清单中的 Class-Path 属性并没有像您想象的那样工作。见http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

注意:Class-Path 标头指向目录上的类或 JAR 文件 本地网络,而不是 JAR 文件中的 JAR 文件或可访问的类 通过互联网协议。在 JAR 中加载 JAR 文件中的类 文件进入类路径,你必须编写自定义代码来加载那些 类。例如,如果 MyJar.jar 包含另一个名为 MyUtils.jar,您不能在 MyJar.jar 中使用 Class-Path 标头 manifest 将 MyUtils.jar 中的类加载到类路径中。

最简单的解决方案是将类路径 jar 放在 jar 之外,并创建一个小批处理文件或 shell 脚本来构建类路径并调用您的 jar。

【讨论】:

  • 我的罐子里没有嵌套的罐子。
【解决方案2】:

恐怕设置您的MANIFEST Class-path 不会让您成功地从nested jar 加载类(即,在您的 jar 中,如 Ian 回答的链接中所述)。
如果你想打包单个可执行 jar,你最好的选择是:

【讨论】:

  • @EJP 你不正确。请参阅 Ian 的回答中的链接。 not JAR files within the JAR file or classes accessible over internet protocol
  • @EJP - 想删除你的反对票吗?在做出决定之前,请仔细阅读我的答案。谢谢
  • 根本没有投票:我建议更改“本地”一词,它具有误导性且不准确。 “嵌套”要好得多
  • @b.buchhold 谢谢。已更正。
  • 非常感谢您一直以来的帮助,帮助我找到了问题的根源,我学到了很多,这是一次宝贵的经验。
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 2020-10-15
  • 2014-01-26
  • 1970-01-01
  • 2017-03-20
  • 2014-07-21
  • 2016-08-23
  • 2020-12-24
相关资源
最近更新 更多