2014-08-29 24 views
1

我花了很多時間處理一個任務,「讀取存儲在Zipfile中存儲的Jar中的類文件」並始終返回相同的ClassNotFoundException。我只是尋求一些關於如何進行的指導。我在各個網站上閱讀了許多有用的鏈接,但由於任務艱鉅或缺乏相關知識,我仍然遇到問題。在Zipfile中打包的Jar中發現的閱讀類

基本上,我的代碼成功讀取讀取Zipfile,創建一個JarInputstream並找到我請求的類文件。我的問題,當代碼執行該行時找到該文件,cl.loadClass(className)投擲ClassNotFoundException

URL jarUrl = new URL("jar:file:/E:/temp/ZipTest/JarTest_08262014/JarTest3.zip!/activation.jar!/com/sun/activation/viewers/ImageViewer.class"); 
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarUrl }); 
className= "com/sun/activation/viewers/ImageViewer.class"; 
Class loadedClass = cl.loadClass(className); 

一旦我加載了類,我可以使用反射方法來讀取類文件。我寫了一個類,用於讀取位於目錄中的jar文件。

我看着OpenJDK的javap代碼,但我沒有看到任何反射調用。所以,我迷失在這一點上。我構建了一個不正確的URL嗎?

有什麼建議嗎?

+1

據我所知,'URLClassLoader'根本無法做到這一點。您可以在代碼中處理嵌套的'JarInputstream's,但是'URLClassLoader'實現依賴於不支持嵌套的'JarFile' ... – Holger 2014-08-29 14:10:04

+0

您嘗試加載的類名稱應該是完全限定的類名,例如'''''''''''''''''' .viewers.ImageViewer'而不是你的'className'值。此外,可能需要在'newInstance(URL [],ClassLoader)'方法中提供application-classloader,否則某些未由此類加載器加載的類可能會拋出異常,因爲它們的字節定義對於此類加載器而言未知 – 2014-08-29 14:14:55

+0

您可能想要從.zip中提取.jar文件並將其寫入臨時文件,然後創建一個由該臨時文件的URL組成的URLClassLoader。我非常確定URLClassLoader URLs不能是單獨的類文件;每個URL必須是.jar文件或目錄。 – VGR 2014-08-29 15:06:20

回答

0

我想你使用的URLClassloader錯了。 嘗試使用僅指向JAR文件的URL。 缺省URLClassloader不允許嵌套罐。

進一步: 不指定類的文件

方式:

className= "com/sun/activation/viewers/ImageViewer.class";

應該是:

className= "com.sun.activation.viewers.ImageViewer";

0

早上好,

我只是想提供一個更新。

我花了更多的時間去探索額外的線程等,但最終決定從ZIP中提取jar文件到臨時目錄中。我可以成功地使用R eflection類來讀取類文件等。因此,現在,我將使用該解決方案,直到我想出一個不同的解決方案。

如果我真的找到解決方案,我會在這裏發佈。

感謝所有的幫助下, 豐富