可执行JAR忽略其自己的Class-Path属性

Gil*_*ili 13 java jar classpath

我使用了Maven中的指令- 如何在jar中添加任意类路径条目以Class-Path属性添加任意条目.这是我的MANIFEST.MF档案:

Manifest-Version: 1.0
Class-Path: jace-runtime.jar
Main-Class: org.jace.examples.Test
Run Code Online (Sandbox Code Playgroud)

我定义了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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里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

有任何想法吗?

Gil*_*ili 17

回答我自己的问题:

  1. 添加任意条目就Class-Path可以了.使用以下命令启用JAR索引时会出现问题:

    <configuration>
      <archive>
        <index>true</index>
      </archive>
    </configuration>
    
    Run Code Online (Sandbox Code Playgroud)

    Maven会省略你的参赛作品META-INF/INDEX.LIST.

  2. 在运行时使用JAR时,Java将查看INDEX.LIST以查找类,而不是MANIFEST.MF.

  3. 因为INDEX.LIST中缺少您的条目,所以无论清单显示什么,类加载器都不会找到它们.

一个简单的解决方法是禁用JAR索引.我不确定如何在Class-Path启用索引的情况下注入任意内容.