1

我部署一個簡單的OSGi的測試包成的JBoss 7.1.1,並嘗試做的ClassNotFoundException而JBoss的7.1.1動態類加載從OSGi的捆綁

Class clazz = Class.forName("org.jacorb.orb.ORB"); 

我的一切動態實例化Jacorb ORB是

java.lang.ClassNotFoundException: org.jacorb.orb.ORB from [Module "deployment.test:1.0.0" from Service Module Loader] 

我已經做了:

  • 在JBoss配置standalone.xml我添加的F或osgi子系統的能力<capability name="org.jacorb" startlevel="1"/>,以便加載org.jacorb模塊。這已經解決了這個問題,我的測試包安裝失敗。
  • 我宣佈Dependencies -Descriptor上org.jacorbMANIFEST.MF(也試過與不export選項):Dependencies: org.jacorb export

  • 我加入了jboss-deployment-structure.xmlMETA-INF包含以下內容

    < XML version =「1.0」encoding =「UTF-8」? > < JBoss的部署結構> <部署> <依賴性> <模塊名稱= 「org.jacorb」/ > < /依賴性> < /部署> </JBoss的部署結構>

另外我做了實驗與類加載器並認識到,ContextClassLoader是null。但最終,我無法將其作爲非測試代碼來實現,因爲Class.forName()無法更改爲使用特定的類加載器。

那麼,爲什麼我會得到這個ClassNotFoundException?

在此先感謝

亞歷

回答

0

如果你有一個正常的OSGi包,並且應該看到org.jacorb.orb.ORB類, 那麼你應該有: 1.所有org.jacorb包和子包必須在osgi框架中導出。 2.您的軟件包必須導入您使用的所有軟件包 - 例如與 「Import-Package:org.jacorb.orb」 檢查版本是否兼容。 檢查您是否導入所有包和子包。 org.jacorb的導入並不意味着org.jacorb.orb。

如果兩個條件都滿足,那麼bundle的Bundle Classloader應該能夠看到org.jacorb.orb.ORB。

1

後挖我確實拼圖;-)

  1. standalone.xml/domain.xml的JBoss配置小時我在<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">部分加入<capability name="org.jacorb" startlevel="1"/><capabilities>
  2. 下在我加入DynamicImport-Package: org.jacorb.orbMETA-INF/MANIFEST.MF以允許類加載器動態擴展運行期間的類路徑
  3. 將上下文類加載器設置爲Thread.currentThread().setContextClassLoader(getClass().getClassLoader(),該上下文類加載器在
  4. 之前已經是 null
+0

你試過'Import-Package:org.jacorb.org'或'Import-Package:org.jacorb.org; resolution = optional'?這些是推薦的方式,DynamicImport-Package不是。另外,Class.forName()*不會爲類加載器提供可選參數。 – eis 2013-03-05 14:10:26