JBoss 7加载奇迹

时间:2014-01-10 11:01:30

标签: java osgi jboss7.x classloader

我遇到了在JBoss 7下捆绑为WAR的webservice / OSGi应用程序的问题。

我的问题是:

  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
  4. 感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

回答我自己的问题:

  1. 隐式添加的模块在JBoss文档中有详细描述:https://docs.jboss.org/author/display/AS7/Implicit+module+dependencies+for+deployments。正如另一个答案所述,可以通过在jboss-deployment-structure.xml中声明排除来抑制依赖关系。

  2. 见上面的答案

  3. 部署到JBoss的应用程序是一个WAR文件,它本身可以引导OSGi容器。容器内部Gemini Blueprint用于管理OSGi服务依赖项。 Gemini Blueprint搜索Spring Application Context文件,并在找到时为该bundle启动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
    

答案 1 :(得分:0)

  1. 您可以查看管理控制台/ OSGi选项卡,了解运行时可用的内容。 “默认情况下”取决于您的启动配置,您可以使用4个备用启动配置文件IIRC。

  2. 检查$ JBOSS / modules / sun / jdk / main / module.xml以查看导入的包和不导入的包。只有其中一些是。您需要通过using jboss-deployment-structure手动添加或修改sun.jdk module.xml文件的其他文件(如果需要)。除了JDK之外,还有其他自动依赖项,它们列在this page上。

  3. 您需要提供更多详细信息来解答此问题,包括您的依赖关系。 Xerces解析器是模块化类加载器的一大难题。

答案 2 :(得分:0)

问题是使用setContextClassLoader方法。这会覆盖可以加载DocumentBuilderFactory的类加载器。解决方法是使用OrderClassLoaders。

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