繁体   English   中英

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

[英]Executable JAR ignores its own Class-Path attribute

我使用了Maven中的指令- 如何向jar中添加任意Class-Path条目以向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.ShutdownHookjace-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

有任何想法吗?

回答我自己的问题:

  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

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

所以,如果你期待一个WAR与WEB-INF / classes中的清单类路径中找到存档的WEB-INF / classes目录条目类,那么你会失望的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM