2013-03-13 87 views
1

在eclipse插件項目中,我有一個jar文件,我想從中加載類和調用方法。這些jar被添加到清單文件中的bundle classpath中。如何加載這些類運行時,如果我嘗試與urlclassloader我得到java.lang.NoClassDefFoundError但我相信類是在那裏。我讀過基於eclipse的osgi並使用它自己的類加載器,並且可能因此導致此錯誤。但爲什麼 ?有沒有人對我的問題有一個很好的解釋和實際的解決方案? 謝謝。eclipse插件類加載錯誤

+1

第一個實用的解決方案是停止使用URLClassLoader。爲什麼在那裏? – 2013-03-13 13:39:06

回答

3

這是由OSGi的不同的類加載機制引起的問題。 首先,檢查是否將正確的導入聲明添加到了manifest。 如果導入是正確的(並且版本正確),它們可能不可見,因爲您正在使用的JAR沒有導出所需的類。 OSGi只能看到導出的類。 使用Eclipse,這意味着您使用Equinox作爲OSGi實現,您可以使用Eclipse-Buddy-Classloading。 使用JAR創建一個新項目並導出所有內容。現在將其註冊爲主包的夥伴 - 主包現在可以看到提供包的每個類。

請記住,在OSGi中使用類加載器是'邪惡'。班級無法通過完全合格的班級名稱來識別。

看看OSGi的核心規範關於OSGi類加載(osgi.org)和http://rajakannappan.blogspot.de/2010/03/eclipse-classloading-and-buddy-policy.html

0

我有一個類似的問題,這裏是我的解決方案的更多信息。這可能有點晚,但我希望它能幫助其他人解決同樣的問題。

我注意到eclipse(osgi)的類加載器沒有加載完整的jar。它只加載通過classloader.load(classname)直接加載的類。所以我只讀了包含在jar中的所有類名,代碼爲this question,並通過調用顯式classloader.load(classname)來遍歷所有className。下面是我管理的方式示例:

private void loadClasses(final File jar) { 
    final URL url = new URL("jar", "", "file:" + jar.getAbsolutePath() + "!/"); 
    final List<String> classNames = getAllClassNames(jar); //Code from above link in this method 
    final URLClassLoader classloader = new URLClassloader(url, this.getClass().getClassLoader()); 
    for (String className : classNames) { 
     classLoader.load(className); 
    } 
} 

如果你想實例化一個類你可以做到這一點與

final Class<?> clazz = classLoader.load(className); 
final T type = (T)clazz.newInstance(); 

希望這有助於。