我正在尝试设置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我不能使用硬编码或自动生成的。
有什么想法吗?
更新 重新提出这个问题,因为目前这不可能来自清单本身。答案是唯一真正可行的,不需要提取罐子,虽然它也有效。
因此,作为摘要,答案是否定的,如果您有未指定的依赖项,则无法单独使用清单文件。
答案 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/
$ 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