是否可以使用jar清单来使用文件夹中的所有jar

时间:2016-10-03 20:29:38

标签: java jar dependencies manifest

我正在尝试设置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中得到关于类的NoClassDefinition错误。

如果有人好奇,此文件夹可能包含在类加载期间处理的可选jar。那个'swhy我不能使用硬编码或自动生成的。

有什么想法吗?

更新 重新提出这个问题,因为目前这不可能来自清单本身。答案是唯一真正可行的,不需要提取罐子,虽然它也有效。

因此,作为摘要,答案是否定的,如果您有未指定的依赖项,则无法单独使用清单文件。

3 个答案:

答案 0 :(得分:1)

java不知道libs目录中的jar文件。 如果您使用的是java 1.6+,则可以将程序作为

运行

java -cp lib / * -jar MyJar.jar

答案 1 :(得分:1)

您应该将Manifest类路径定义为

Class-Path: libs/lib1.jar libs/lib2.jar

有关详细信息,请参阅Oracle文档https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

答案 2 :(得分:1)

尝试提取这些罐子。看起来您无法从目录添加所有jar,但您可以添加所有类。您显然会丢失清单中的所有配置,但是,如果您只对jar的代码内容感兴趣,它可能会有效。

我用这些简单的类测试了

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-Path。我可以使用java -cp libB.jar:libA.jar A运行A.现在我创建另一个将Class-Path设置为lib/

的jar
$ 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