1

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

remote.jar

 -com
 -lib
 -META-INF

下面META-INF是文件MANIFEST.MF

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

并且所有罐子都在lib文件夹下。

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

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

编辑:

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

4

2 回答 2

2

问题是清单中的 Class-Path 属性不能像您认为的那样工作。请参阅http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

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

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

于 2013-11-07T09:31:08.763 回答
1

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

于 2013-11-07T09:33:22.810 回答