是否可以有一个 jar Manifest 来使用文件夹中的所有 jar
Is it possible to have a jar Manifest to use all jars in a folder
我正在尝试设置 jar 清单,以便它加载 jar 旁边的文件夹中的所有库(jar)。
清单如下所示:
Manifest-Version: 1.0
Class-Path: libs/
Main-Class: path.to.my.class.Main
布局如下:
- MyJar.jar
- libs/
-----lib1.jar
-----lib2.jar
我正在尝试 运行 像这样:
java -jar MyJar.jar
我在文件夹中的 jar 中收到关于 classes 的 NoClassDefinition 错误。
如果有人好奇,此文件夹可能包含在 class 加载期间处理的可选 jar。那就是为什么我不能使用硬编码或自动生成的。
有什么想法吗?
更新
改写问题,因为清单本身目前无法做到这一点。答案是唯一真正可行的,不需要提取罐子,尽管它也有效。
总而言之,答案是否定的,如果您有未指定的依赖项,这不能仅从清单文件完成。
java不知道libs目录下的jar文件。
如果您使用的是 java 1.6+,您可以 运行 编程为
java -cp lib/* -jar MyJar.jar
您应该将清单类路径定义为
Class-Path: libs/lib1.jar libs/lib2.jar
有关详细信息,请参阅 Oracle 文档https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
尝试提取这些罐子。看起来您无法添加目录中的所有 jar,但您可以添加所有 类。您显然丢失了清单中的所有配置,但是,如果您只对 jars 的代码内容感兴趣,它可能会起作用。
我用这些简单的 类
进行了测试
import pkg.B;
public class A {
public static void main(String[] args) {
System.out.println(B.class.getName());
}
}
package pkg;
public class B {}
现在我试着分开 类。我已经把他们吵到了
$ jar tf libA.jar
META-INF/
META-INF/MANIFEST.MF
A.class
$ jar tf libB.jar
META-INF/
META-INF/MANIFEST.MF
pkg/B.class
无Class-任何清单中的路径。我可以 运行 A 和 java -cp libB.jar:libA.jar A
。现在我创建另一个 jar,其中 Class-Path 设置为 lib/
$ cat manifest
Class-Path: lib/
$ jar cfm empty.jar manifest
我的目录树看起来像
$ ls -R
.:
A.java empty.jar lib lib.jar manifest pkg
./lib:
libA.jar libB.jar
./pkg:
B.java
现在我试试 jar
$ java -jar empty.jar
Error: Could not find or load main class A
绝望,对吧?然后我将 libA.jar 和 libB.jar 提取到 lib 中(与 [this guy][2] 相同)。现在一切都很好
$ java -jar empty.jar
pkg.B
我正在尝试设置 jar 清单,以便它加载 jar 旁边的文件夹中的所有库(jar)。
清单如下所示:
Manifest-Version: 1.0
Class-Path: libs/
Main-Class: path.to.my.class.Main
布局如下:
- MyJar.jar
- libs/
-----lib1.jar
-----lib2.jar
我正在尝试 运行 像这样:
java -jar MyJar.jar
我在文件夹中的 jar 中收到关于 classes 的 NoClassDefinition 错误。
如果有人好奇,此文件夹可能包含在 class 加载期间处理的可选 jar。那就是为什么我不能使用硬编码或自动生成的。
有什么想法吗?
更新 改写问题,因为清单本身目前无法做到这一点。答案是唯一真正可行的,不需要提取罐子,尽管它也有效。
总而言之,答案是否定的,如果您有未指定的依赖项,这不能仅从清单文件完成。
java不知道libs目录下的jar文件。 如果您使用的是 java 1.6+,您可以 运行 编程为
java -cp lib/* -jar MyJar.jar
您应该将清单类路径定义为
Class-Path: libs/lib1.jar libs/lib2.jar
有关详细信息,请参阅 Oracle 文档https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
尝试提取这些罐子。看起来您无法添加目录中的所有 jar,但您可以添加所有 类。您显然丢失了清单中的所有配置,但是,如果您只对 jars 的代码内容感兴趣,它可能会起作用。
我用这些简单的 类
进行了测试import pkg.B;
public class A {
public static void main(String[] args) {
System.out.println(B.class.getName());
}
}
package pkg;
public class B {}
现在我试着分开 类。我已经把他们吵到了
$ jar tf libA.jar
META-INF/
META-INF/MANIFEST.MF
A.class
$ jar tf libB.jar
META-INF/
META-INF/MANIFEST.MF
pkg/B.class
无Class-任何清单中的路径。我可以 运行 A 和 java -cp libB.jar:libA.jar A
。现在我创建另一个 jar,其中 Class-Path 设置为 lib/
$ cat manifest
Class-Path: lib/
$ jar cfm empty.jar manifest
我的目录树看起来像
$ ls -R
.:
A.java empty.jar lib lib.jar manifest pkg
./lib:
libA.jar libB.jar
./pkg:
B.java
现在我试试 jar
$ java -jar empty.jar
Error: Could not find or load main class A
绝望,对吧?然后我将 libA.jar 和 libB.jar 提取到 lib 中(与 [this guy][2] 相同)。现在一切都很好
$ java -jar empty.jar
pkg.B