可执行 JAR 忽略其自己的类路径属性

2022-09-04 20:42:44

我使用了在Maven上找到的说明 - 如何将任意类路径条目添加到jar中以向属性添加任意条目。这是我的文件:Class-PathMANIFEST.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.ShutdownHookjace-runtime.jarjava -jar peer_example1.jar

classpath: peer_example1.jar线程 “main” java.lang.ClassNotFoundException 中的异常:org.jace.util.ShutdownHook

换句话说,Java正在将可执行JAR文件添加到类路径中,但忽略了。如果我调用,我会得到预期的输出:Class-Pathjava -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test

classpath: jace-runtime.jar;peer_example1.jar

有什么想法吗?


答案 1

回答我自己的问题:

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

    <configuration>
      <archive>
        <index>true</index>
      </archive>
    </configuration>
    

    Maven 将省略您的输入。META-INF/INDEX.LIST

  2. 当您在运行时使用JAR时,Java将查看INDEX。用于查找类的列表,而不是清单。断续器

  3. 因为 INDEX 中缺少您的条目。LIST,无论清单说什么,类装入器都不会找到它们。

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


答案 2

对于那些可能不知道的人,可执行归档机制会获取清单类路径,并使用它来装入归档文件外部的类。

因此,如果您期望使用WEB-INF/类的清单类路径的WAR在存档中的WEB-INF /类条目中找到类,那么您将感到失望。


推荐