我使用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
时,我得到以下输出:
classpath: 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
,我会得到预期的输出:
classpath: jace-runtime.jar;peer_example1.jar
有什么想法吗?
答案 0 :(得分:17)
回答我自己的问题:
将任意条目添加到Class-Path
本身就可以了。使用以下命令启用JAR索引时会出现问题:
<configuration>
<archive>
<index>true</index>
</archive>
</configuration>
Maven会从META-INF/INDEX.LIST
中省略您的参赛作品。
在运行时使用JAR时,Java会查看INDEX.LIST以查找类,而不是MANIFEST.MF。
因为INDEX.LIST中缺少您的条目,所以无论清单显示什么,类加载器都不会找到它们。
一个简单的解决方法是禁用JAR索引。我不确定如何在启用索引的情况下注入任意Class-Path
。
答案 1 :(得分:0)
对于那些可能不知道的人,可执行存档机制采用清单类路径并使用它将类外部加载到存档。
因此,如果你期望一个带有WEB-INF / classes清单类路径的WAR来查找WEB-INF / classes条目里面存档中的类,那么你会感到很失望。
答案 2 :(得分:-4)
根据jar选项的tooldocs页面 - Link to docs
使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。