是否可以有一个 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