带有 bouncycastle 库的 jar 文件:NoClassDefFoundError
Posted
技术标签:
【中文标题】带有 bouncycastle 库的 jar 文件:NoClassDefFoundError【英文标题】:jar file with bouncycastle libraries: NoClassDefFoundError 【发布时间】:2012-01-08 17:41:20 【问题描述】:我正在努力让我的 jar 文件在网络浏览器中运行。 当我从 Eclipse 运行小程序时,一切正常,但是从浏览器中我得到一个 NoClassDefFoundError :
Exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/bouncycastle/openpgp/PGPException
java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/bouncycastle/openpgp/PGPException
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3116)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1498)
at java.lang.Thread.run(Thread.java:662)
PGPException 位于 bcpg-jdk16-146.jar 存档的 org/bouncycastle/openpgp/ 目录中... 我的 JAR 包含来自 bouncycastle 的库和我的小程序类。这里是它的架构:
META-INF
-MANIFEST.MF
-CNSAPPLE.SF
-CNSAPPLE.RSA
lib
-bcprov-jdk16-146.jar
-bcpg-jdk16-146.jar
com
-CNSApplet.class
清单文件定义类路径和主类如下:
类路径:lib/bcpg-jdk16-146.jar lib/bcprov-jdk16-146.jar
主类:com.CNSApplet
以及调用小程序的html代码:
<applet code="com.CNSApplet.class" archive="cnsapplet.jar">
当然html文件和cnsapplet jar文件在同一目录下。
我尝试用sun method 和这个other one 制作我的罐子。
【问题讨论】:
【参考方案1】:Java 默认 ClassLoader 不会查找 JAR 中嵌入的 JAR 文件。这意味着为了在 JAR 的类路径中包含这些库,您可以执行以下任一操作:
-
解压缩库 JAR,然后将类文件打包到您自己的 JAR 中
将库 JAR 从您的 JAR 中删除,然后使用清单文件引用它们(就像您所做的那样)。
【讨论】:
我尝试了这两种解决方案,但总是遇到相同的异常。我还尝试删除与 BC 库相关的代码并相应地导入。但是很明显,当浏览器检索 jar 时,它就像是以前的 jar 与 BC 库一样! 听起来像是缓存问题 - 确保在测试之前清除浏览器缓存,因为大多数浏览器会缓存 JAR 以不必再次下载它们。 这可能是问题所在,现在可以了!谢谢,下次我会记住这一点【参考方案2】:JAR 文件中的 Class-Path 清单条目指向文件系统(相对于 JAR 文件),而不是嵌入在 JAR 文件中的文件。
解压 BC jar 并将其内容添加到您的 JAR 文件中,或者提供 BC jar 作为单独的下载。您可以在 applet 标记的归档属性中指定多个 JAR 文件,方法是用逗号分隔它们。
由于 BC jar 已签名,如果您将内容重新打包到自己的 JAR 文件中,则签名会丢失,最好的解决方案可能是将它们作为单独的文件提供并在存档属性中列出。
【讨论】:
以上是关于带有 bouncycastle 库的 jar 文件:NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
使用 Bouncy Castle 库会导致输出 .jar 文件大小大幅增加
Bouncycastle和PKCS#1 v2.1,使用RSASSA-PSS进行签名并使用带有RSAES-OAEP的AES CBC进行加密
在哪里放置 bouncycastle jar 让它成为 Java JDK 的加密服务提供者?