Java JBoss7类加载奇迹

Java JBoss7类加载奇迹,java,osgi,jboss7.x,classloader,Java,Osgi,Jboss7.x,Classloader,我对JBoss7下捆绑为WAR的webservice/OSGi应用程序有问题 我的问题是: 默认情况下,应用程序可以使用哪些模块?我知道如何添加依赖项以及如何排除依赖项。但是我怎么知道默认值呢?我认为它们被称为“全球模块” 默认情况下,哪些JDK包提供给应用程序?全部的一些我该如何调查这件事 具体错误如下。一些引导代码调用javax.xml.parsers.DocumentBuilderFactory.newInstance()。这将导致异常javax.xml.parsers.FactoryCo

我对JBoss7下捆绑为WAR的webservice/OSGi应用程序有问题

我的问题是:

  • 默认情况下,应用程序可以使用哪些模块?我知道如何添加依赖项以及如何排除依赖项。但是我怎么知道默认值呢?我认为它们被称为“全球模块”
  • 默认情况下,哪些JDK包提供给应用程序?全部的一些我该如何调查这件事
  • 具体错误如下。一些引导代码调用
    javax.xml.parsers.DocumentBuilderFactory.newInstance()
    。这将导致异常
    javax.xml.parsers.FactoryConfigurationError:Provider\uuuu重定向。未找到\uuu DocumentBuilderFactory
    。在JBoss中,系统属性
    javax.xml.parsers.DocumentBuilderFactory
    似乎指向了上述奇怪的实现
    \uuuuuu重定向
  • 谢谢你的帮助

  • 您可以查看管理控制台/OSGi选项卡,查看在运行时有哪些可用功能。“默认情况下”取决于您的启动配置,有4种可选的启动配置文件可以使用IIRC

  • 检查$JBOSS/modules/sun/jdk/main/module.xml以查看导入的包和未导入的包。只有一些是这样。如果需要,还需要手动添加或修改sun.jdk module.xml文件。除了JDK之外,还有其他自动依赖项,这些依赖项在上列出

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


  • 回答我自己的问题:

  • 此处的JBoss文档详细描述了隐式添加的模块:。另一个答案已经指出,可以通过在
    jboss deployment structure.xml
    中声明excludes来抑制依赖关系

  • 见上面的答案

  • 部署到JBoss的应用程序是一个WAR文件,它本身引导一个OSGi容器。容器内的Gemini Blueprint用于管理OSGi服务依赖项。Gemini Blueprint搜索Spring应用程序上下文文件,如果找到,则启动捆绑包的Spring上下文。解析XML文件失败,出现上述异常。原因是包无法使用重定向的包
    \uu
    。我是通过授权来完成的

    # 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
    

  • 问题在于setContextClassLoader方法的使用。这将覆盖可以加载DocumentBuilderFactory的classloder。解决方法是使用OrderClassLoader

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

    刚刚在文档中找到了一个很好的起点:你如何知道双子座的蓝图正在被使用?我在《凤凰社》里没有看到这方面的任何东西