我遇到了在JBoss 7下捆绑为WAR的webservice / OSGi应用程序的问题。
我的问题是:
javax.xml.parsers.DocumentBuilderFactory.newInstance()
。这导致异常javax.xml.parsers.FactoryConfigurationError: Provider __redirected.__DocumentBuilderFactory not found
。似乎在JBoss中,系统属性javax.xml.parsers.DocumentBuilderFactory
指向上述奇怪的实现__redirected.__DocumentBuilderFactory
。感谢您的帮助!
答案 0 :(得分:1)
回答我自己的问题:
隐式添加的模块在JBoss文档中有详细描述:https://docs.jboss.org/author/display/AS7/Implicit+module+dependencies+for+deployments。正如另一个答案所述,可以通过在jboss-deployment-structure.xml
中声明排除来抑制依赖关系。
见上面的答案
部署到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)
您可以查看管理控制台/ OSGi选项卡,了解运行时可用的内容。 “默认情况下”取决于您的启动配置,您可以使用4个备用启动配置文件IIRC。
检查$ JBOSS / modules / sun / jdk / main / module.xml以查看导入的包和不导入的包。只有其中一些是。您需要通过using jboss-deployment-structure手动添加或修改sun.jdk module.xml文件的其他文件(如果需要)。除了JDK之外,还有其他自动依赖项,它们列在this page上。
您需要提供更多详细信息来解答此问题,包括您的依赖关系。 Xerces解析器是模块化类加载器的一大难题。
答案 2 :(得分:0)
问题是使用setContextClassLoader方法。这会覆盖可以加载DocumentBuilderFactory的类加载器。解决方法是使用OrderClassLoaders。
Thread currentThread = Thread.currentThread();
ClassLoader originalCl = currentThread.getContextClassLoader();
currentThread.setContextClassLoader( new OrderClassLoaders( myCl, originalCl ) );