Java JBoss7类加载奇迹
我对JBoss7下捆绑为WAR的webservice/OSGi应用程序有问题 我的问题是: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
javax.xml.parsers.DocumentBuilderFactory.newInstance()
。这将导致异常javax.xml.parsers.FactoryConfigurationError:Provider\uuuu重定向。未找到\uuu DocumentBuilderFactory
。在JBoss中,系统属性javax.xml.parsers.DocumentBuilderFactory
似乎指向了上述奇怪的实现\uuuuuu重定向
回答我自己的问题:
jboss deployment structure.xml
中声明excludes来抑制依赖关系\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 ) );
刚刚在文档中找到了一个很好的起点:你如何知道双子座的蓝图正在被使用?我在《凤凰社》里没有看到这方面的任何东西