13

我使用了在Maven 中找到的说明 - 如何将任意类路径条目添加到 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 线程“主”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

有任何想法吗?

4

3 回答 3

20

回答我自己的问题:

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

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

    Maven 会从META-INF/INDEX.LIST.

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

  3. 因为您的条目从 INDEX.LIST 中丢失,所以无论清单上说什么,类加载器都不会找到它们。

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

于 2012-05-03T18:19:52.257 回答
0

对于那些可能不知道的人,可执行存档机制采用清单类路径并使用它来加载存档外部的类。

因此,如果您期望一个带有 WEB-INF/classes 清单类路径的 WAR 以在存档内的 WEB-INF/classes 条目中查找类,那么您将感到失望。

于 2014-01-05T23:05:29.700 回答
-4

根据 jar 选项的 tooldocs 页面 -链接到文档

使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。

于 2012-05-03T17:59:48.890 回答