我使用了在 Maven - how can I add an arbitrary classpath entry to a jar 中找到的说明将任意条目添加到 Class-Path
属性。这是我的 MANIFEST.MF
文件:
Manifest-Version: 1.0
Class-Path: jace-runtime.jar
Main-Class: org.jace.examples.Test
我定义了 org.jace.examples.Test 如下:
public class Test
{
public static void main(String[] args)
{
System.out.println("classpath: " + System.getProperty("java.class.path"));
System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook"));
}
}
其中 org.jace.util.ShutdownHook
在 jace-runtime.jar
中定义。当我调用 java -jar peer_example1.jar
时,我得到以下输出:
类路径:peer_example1.jar
线程“main”中的异常 java.lang.ClassNotFoundException: org.jace.util.ShutdownHook
换句话说,Java 将可执行 JAR 文件添加到类路径但忽略 Class-Path
。如果我调用 java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test
我会得到预期的输出:
类路径:jace-runtime.jar;peer_example1.jar
有什么想法吗?
最佳答案
回答我自己的问题:
将任意条目添加到
Class-Path
本身就没问题。当您使用以下方法启用 JAR 索引时会出现问题:<configuration> <archive> <index>true</index> </archive> </configuration>
Maven 会从
META-INF/INDEX.LIST
中忽略您的条目。当您在运行时使用 JAR 时,Java 将查看 INDEX.LIST 来查找类,而不是 MANIFEST.MF。
因为 INDEX.LIST 中缺少您的条目,所以无论 list 怎么说,类加载器都找不到它们。
一个简单的解决方法是禁用 JAR 索引。我不确定如何在启用索引的情况下注入(inject)任意 Class-Path
。
关于java - 可执行 JAR 忽略它自己的 Class-Path 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436517/