带有bouncycastle库的jar文件:NoClassDefFoundError

时间:2011-11-29 11:16:00

标签: java bouncycastle executable-jar japplet

我很难从网络浏览器中获取我的jar文件。 当我从Eclipse运行applet时一切正常,但是从浏览器中我得到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

调用applet的html代码:

<applet code="com.CNSApplet.class" width="800" height="300" archive="cnsapplet.jar">

当然,html文件位于cnsapplet jar文件的同一目录中。

我尝试使用sun methodother one来制作我的jar。

2 个答案:

答案 0 :(得分:2)

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

  1. 解压缩库JAR,然后将类文件打包到您自己的JAR中
  2. 将库JAR从JAR中删除,然后使用清单文件引用它们(就像你一样)。

答案 1 :(得分:0)

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

解压缩BC jar并将其内容添加到JAR文件中,或者将BC jar作为单独的下载提供。您可以在applet标记的归档属性中指定多个JAR文件,方法是用逗号分隔它们。

由于BC jar被签名并且如果您将内容重新打包到您自己的JAR文件中,签名就会丢失,最好的解决方案可能是将它们作为单独的文件提供并将它们列在归档属性中。