【问题标题】:NoClassDefFoundError when jar file in created in a subdirectory在子目录中创建 jar 文件时出现 NoClassDefFoundError
【发布时间】:2018-09-03 02:31:15
【问题描述】:

当我在子目录中创建 jar 文件时,bcprov-jdk15on-159.jar 中的 BouncyCastleProvider 类无法使用 ClassNotFoundException 加载。我认为创建 jar 文件的位置应该对其内容和行为没有影响。

这是创建工作 jar 的示例。

$ jar cfm MyProject.jar Manifest.txt Main.class bcprov-jdk15on-159.jar
$ java -jar MyProject.jar
hello provider: BC version 1.59

这是一个示例,其中使用完全相同的输入文件运行 jar,但 jar 文件目标不同,导致 jar 失败。

$ jar cfm dist/MyProject.jar Manifest.txt Main.class bcprov-jdk15on-159.jar
$ java -jar dist/MyProject.jar
Error: Unable to initialize main class Main
Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider

这是文件Manifest.txt

Manifest-Version: 1.0
Main-Class: Main
Class-Path: bcprov-jdk15on-159.jar

这是使用BouncyCastleProvider 类的Main.java 文件。

public class Main {
    public static void main(String... arg) {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        java.security.Provider p = java.security.Security.getProvider("BC");
        System.out.println("hello provider: " + p);
    }
}

我在 JDK 8 和 JDK 9 以及 JDK jar 命令(如上所示)和 Ant 的 jar 任务中都看到了这种行为。

我在尝试升级 PCSecrets 密码管理器以在 Java 9 下工作时偶然发现了这个问题。

【问题讨论】:

    标签: java jar bouncycastle classnotfoundexception


    【解决方案1】:

    上述失败的原因是Java不会从jar文件中加载bcprov-jdk15on-159.jar,而是从类路径中加载,这似乎根据调用jar的位置而有所不同。当生成的 jar 文件与bcprov-jdk15on-159.jar 位于同一目录时,它会从目录中加载它,并且命令调用工作正常。生成的jar文件在其他目录时,加载bcprov-jdk15on-159.jar失败,抛出ClassNotFoundExceptionthis question 中提供了在 jar 中包含 jar 的解决方案。有趣的是,this answer 被投票了 26 次,也是基于同样的错误假设。

    我通过比较生成的 jar 文件的二进制图像找到了答案。它们似乎仅在 META-INF/MANIFEST.MF 文件的时间戳上有所不同。通过使用命令jar cfm dist/MyProject.jar Manifest.txt Main.class bcprov-jdk15on-159.jar & jar cfm MyProject.jar Manifest.txt Main.class bcprov-jdk15on-159.jar 并行生成这两个文件,我有两个仍然行为不端的位相同的 jar 文件。这促使我查看两个文件的执行环境,而不是文件本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多