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

标签 java jar classpath

我使用了在 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.ShutdownHookjace-runtime.jar 中定义。当我调用 java -jar peer_example1.jar 时,我得到以下输出:

类路径: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 我会得到预期的输出:

类路径: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 中缺少您的条目,所以无论 list 怎么说,类加载器都找不到它们。

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

关于java - 可执行 JAR 忽略它自己的 Class-Path 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436517/

相关文章:

java - 最佳实践 : How to check for a specific java. util.Calendar/Date in SQL.DATE by JDBC?

java - 抽象工厂模式 - 未使用的代码

Java:如何指定一个目录,这样我就不需要指定它来引用它的 .jar 文件

java - 如何使jar文件在启动时运行

linux - 比较 2 个 jar 文件中的文件名?

java - 在终端上使用 -classpath 不起作用

java - 无条件编程 - 不能使用 If、Else 或 Switch

java - 从 jar 中获取资源 : classloader vs class resourceasstream

java - 如何在 Ubuntu 和 Windows (Cygwin) 中使用的 bash 脚本中设置 Java 类路径

java - 为什么我不能将 double 隐式转换为 int?