带有Bouncycastle库的jar文件:NoClassDefFoundError

4

我正在努力让我的jar文件能够在Web浏览器中正常运行。 当我从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的两个库和一个我的applet类。这是它的架构:
META-INF
    -MANIFEST.MF
    -CNSAPPLE.SF
    -CNSAPPLE.RSA
lib
    -bcprov-jdk16-146.jar
    -bcpg-jdk16-146.jar
com
    -CNSApplet.class

清单文件定义了类路径和主类,如下所示:

Class-Path: lib/bcpg-jdk16-146.jar lib/bcprov-jdk16-146.jar

Main-Class: com.CNSApplet

调用小程序的HTML代码:
<applet code="com.CNSApplet.class" width="800" height="300" archive="cnsapplet.jar">

当然,HTML文件与cnsapplet jar文件在同一目录中。
我尝试使用sun method其他方法来创建我的jar文件。
2个回答

2

Java默认的ClassLoader并不会寻找嵌入在您的JAR文件中的JAR文件。这意味着为了将库包含在您的JAR类路径中,您可以执行以下任一操作:

  1. 解压库JAR文件,然后将类文件打包到您自己的JAR中。
  2. 将库JAR文件留出JAR文件,并使用清单文件引用它们(就像您之前所做的那样)。

我尝试了这两种解决方案,但总是得到相同的异常。我还尝试删除与BC库相关的代码和相应的导入。但显然当浏览器检索jar文件时,它就像是先前带有BC库的jar文件! - renard
1
听起来像是缓存问题 - 在测试之前确保清除浏览器缓存,因为大多数浏览器会缓存 JAR 文件以避免重复下载。 - Kraylog
那可能就是问题所在了,现在它可以工作了!谢谢,我会记住这个方法以备下次使用。 - renard

0

JAR文件中的Class-Path清单条目指向文件系统(相对于JAR文件),而不是嵌入在JAR文件中的文件。

要么解压BC JAR并将其内容添加到您的JAR文件中,要么将BC JAR作为单独的下载提供。您可以通过用逗号分隔它们来在applet标记的archive属性中指定多个JAR文件。

由于BC JAR已签名,如果将内容重新打包到自己的JAR文件中,则会丢失签名,因此最好的解决方案可能是将它们作为单独的文件提供,并在archive属性中列出它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接