多模块Maven应用程序中的类加载问题

时间:2019-06-27 21:13:17

标签: spring maven websphere jaxp classloading

我有多模块Maven应用程序。在父pom所在的主目录中,我有一些模块。我正在添加与其他模块相同级别的另一个模块。该应用程序作为EAR打包,并部署到Websphere中,该EAR配置为使用共享库,该共享库基本上是一个包含jar的目录。 Apache Crimson驻留在此共享库中,某些模块使用该库。我正在添加基于Spring Framework 4.0.0.RELEASE的新模块。整个项目是一个遗留项目,并使用Java 6和Hibernate 2.1 :(。问题在于,此绯红色使我的新模块在部署期间崩溃:

  

BeanDefinitionStoreException:解析器配置异常解析   ServletContext资源中的XML [/WEB-INF/spring/root-context.xml];   嵌套的异常是javax.xml.parsers.ParserConfigurationException:   无法使用XSD进行验证:您的JAXP提供者   [org.apache.crimson.jaxp.DocumentBuilderFactoryImpl@706b4db8]不   支持XML模式。您是否正在使用Apache Crimson在Java 1.4上运行?   升级到Apache Xerces(或Java 1.5)以获得完整的XSD支持。

因此,我在新模块中添加了以下内容:

`<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.6.2</version>
</dependency`

但是应用程序仍然从共享库中获取crimson.jar。我试图从父pom中排除此crimson.jar,但仍从共享库中获取。 其他一些作为罐包装的模块要求使用深红色,因此深红色存在于EAR / lib级别。 另一个尝试是更改类加载器的顺序,以首先从新模块中获取jar,然后在层次结构中向上移动(我的新war模块然后是父级耳朵)。但这给了我其他一些例外。 问题是-如何在EAR模块中的WAR模块中不从耳朵级别(也包括在EAR / lib中)取下jar,而仅从WAR级别取?

1 个答案:

答案 0 :(得分:0)

如果WAR中的上一父类加载不起作用(可能是由于WAR中的其他某些内容无法使用该委派模式安全运行),那么我建议您使用与战争。在WAS管理控制台中,使用包含您所需的解析器jar的类路径创建共享库,选择“对此共享库使用隔离的类加载器”选项,然后将该共享库与需要的Web模块相关联它。

隔离的共享库利用父后类加载,但仅用于库中的jar,而不是整个EAR或WAR。因此,您可以将其仅定位到您真正需要使用该委托类型的jar。隔离的库应允许您在WAR中使用Xerces,同时仍在EAR中使用Crimson。