【问题标题】:Executable JAR ignores its own Class-Path attribute可执行 JAR 忽略它自己的 Class-Path 属性
【发布时间】:2012-05-13 06:30:45
【问题描述】:

我使用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 时,我得到以下输出:

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

有什么想法吗?

【问题讨论】:

  • 如果 jar 根被视为当前工作目录,您可能需要 ../jace-runtime.jar。
  • @MarkoTopolnik:我刚试过。它没有用。
  • 但是您是否尝试过访问另一个 jar 中的类?似乎 java.class.path 没有反映从清单中读取的类路径。
  • @MarkoTopolnik:是的,我使用 Class.forName() 查找 jace-runtime.jar 中定义的类,但没有找到。

标签: java jar classpath


【解决方案1】:

根据 jar 选项的工具文档页面 - Link to docs

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

【讨论】:

  • -1:文档中提到了-cp/-classpath 命令行选项被忽略以支持我正在使用的Class-Path 的事实,所以这不是问题。跨度>
【解决方案2】:

回答我自己的问题:

  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

【讨论】:

  • 我希望我能多次对此表示赞同。我有同样的问题大约一年了。直到我看到这个才找到原因。就我而言,我的 .pom 文件中没有此代码,但仍在生成 INDEX.LIST。至少,现在我知道问题出在哪里了。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多