2011-11-29 98 views
3

我努力讓我的jar文件工作從Web瀏覽器。 當我從Eclipse運行一切applet是好的,但是從瀏覽器我得到一個NoClassDefFoundError的:jar文件與bouncycastle庫: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是在組織/ BouncyCastle的/ OpenPGP的/在bcpg-jdk16-146.jar歸檔的目錄雖然... 我的JAR包含來自bouncycastle和我的小應用程序類的庫。這裏它的體系結構:

類路徑:LIB/bcpg-jdk16-146.jar LIB/bcprov-jdk16

META-INF 
    -MANIFEST.MF 
    -CNSAPPLE.SF 
    -CNSAPPLE.RSA 
lib 
    -bcprov-jdk16-146.jar 
    -bcpg-jdk16-146.jar 
com 
    -CNSApplet.class 

因爲它遵循清單文件定義了類路徑和主類-146.jar

主類:com.CNSApplet

和HTML代碼調用applet:

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

當然,該html文件位於cnsapplet jar文件的同一目錄中。

我試過用sun methodother one來製作我的罐子。

回答

1

Java默認的ClassLoader不會查找嵌入到JAR中的JAR文件。這意味着,爲了在您的JAR的類路徑中的庫,你可以做以下任一操作:

  1. 拆開庫JAR,然後將類文件打包到自己的JAR
  2. 離開圖書館的JAR出來的你的JAR,然後使用清單文件引用它們(就像你做的那樣)。
+0

我嘗試了這兩種解決方案,但總是遇到同樣的異常。我也嘗試刪除與BC庫相關的代碼並相應地導入。但顯然當瀏覽器檢索到jar時,就好像它是前一個帶有BC庫的jar! – renard

+1

聽起來像是一個緩存問題 - 確保您在測試之前清除瀏覽器緩存,因爲大多數瀏覽器將緩存JAR而不必再次下載它們。 – Kraylog

+0

這可以說是個問題,它現在起作用了!謝謝,下次我會記住這一點 – renard

0

JAR文件中的類路徑清單條目指向文件系統(相對於JAR文件),而不是JAR文件中嵌入的文件。

解開BC罐並將其內容添加到JAR文件或提供BC罐作爲單獨的下載。您可以在小程序標記的存檔屬性中指定多個JAR文件,方法是用逗號分隔它們。

由於BC罐已簽名,如果將內容重新打包到自己的JAR文件中,簽名會丟失,所以最好的解決方案可能是將它們作爲單獨的文件提供並將它們列在存檔屬性中。

相關問題