【发布时间】: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