2014-01-10 68 views
2

我有一個JBoss的7下捆綁爲WAR與web服務/ OSGi應用程序問題JBoss的類加載7奇蹟

我的問題是:

  1. 哪些模塊可通過默認的應用程序?我知道如何添加依賴關係以及如何排除依賴關係。但我怎麼知道默認值?我認爲他們被稱爲「全球模塊」。
  2. JDK的哪些軟件包默認提供給應用程序?所有?一些?我如何進行調查?
  3. 具體錯誤如下。一些自舉代碼調用javax.xml.parsers.DocumentBuilderFactory.newInstance()。這導致例外javax.xml.parsers.FactoryConfigurationError: Provider __redirected.__DocumentBuilderFactory not found。看起來在JBoss中,系統屬性javax.xml.parsers.DocumentBuilderFactory指向上面的奇怪實現__redirected.__DocumentBuilderFactory

感謝您的幫助!

+0

剛剛發現的文檔一個很好的起點:https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7 – user3181425

回答

0
  1. 您可以檢查管理控制檯/ OSGi選項卡,以查看運行時可用的選項。 「默認情況下」取決於您的啓動配置,您可以使用IIRC的4個備用啓動配置文件。

  2. 檢查$ JBOSS/modules/sun/jdk/main/module.xml以查看哪些軟件包已導入,哪些未導入。其中只有一些是。其他你需要手動添加using jboss-deployment-structure或修改sun.jdk module.xml文件,如果你需要它們。除了JDK,還有其他自動依賴關係,這些關聯列於this page

  3. 您需要提供更多詳細信息來回答這個問題,包括您的依賴關係。 Xerces解析器是模塊化類加載器的一大難題。

1

回答我的問題:

  1. 模塊添加的隱式進行了詳細的JBoss文檔中描述的在這裏找到:https://docs.jboss.org/author/display/AS7/Implicit+module+dependencies+for+deployments。正如其他答案已經指出的那樣,可以通過在jboss-deployment-structure.xml中聲明排除來抑制依賴關係。

  2. 見上面的回答

  3. 部署到JBoss應用程序是自舉本身OSGi容器WAR文件。容器內部Gemini Blueprint用於管理OSGi服務依賴關係。雙子藍圖搜索Spring應用上下文文件,併爲該包啓動一個Spring上下文(如果找到的話)。解析XML文件失敗,出現上述異常。原因是包__redirected不適用於捆綁。我通過啓動委託管理這個。

    # In JBoss some JDK classes like "javax.xml.parsers.DocumentBuilderFactory" are redirected to a JBoss package "__redirected" via a system property 
    # The corresponding implementation "__redirected/__DocumentBuilderFactory" is made accessible from all bundles via "boot delegation" 
    org.osgi.framework.bootdelegation = __redirected 
    # Sets the parent classloader to the one that loads the framework. It must have access to the bootdelegation pakages, e. g. "__redirected" 
    org.osgi.framework.bundle.parent = framework 
    
+0

你怎麼知道正在使用雙子座藍圖?我在OP中沒有看到任何有關這方面的信息 – eis

0

的問題是使用該方法的setContextClassLoader。這覆蓋了可以加載DocumentBuilderFactory的classloder。解決方法是使用OrderClassLoaders。

Thread currentThread = Thread.currentThread(); 
ClassLoader originalCl = currentThread.getContextClassLoader(); 
currentThread.setContextClassLoader(new OrderClassLoaders(myCl, originalCl));