0

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

BeanDefinitionStoreException:解析器配置异常从ServletContext资源解析XML[/WEB-INF/spring/root-context.xml];嵌套异常是 javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.crimson.jaxp.DocumentBuilderFactoryImpl@706b4db8] 不支持 XML Schema。您是否使用 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,但它仍然是从共享库中获取的。一些其他模块需要 Crimson 被打包为 jar,因此 crimson 存在于 EAR/lib 级别。另一种尝试是更改类加载器顺序以首先从新模块中获取罐子,然后在层次结构中向上(我的新战争模块然后是父耳朵)。但这给了我一些其他的例外。问题是 - 如何在 EAR 模块内的 WAR 模块中不从耳朵级别获取 jar(它也包含在 EAR/lib 中)并且仅从 WAR 级别获取?

4

1 回答 1

0

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

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

于 2019-06-28T16:13:40.140 回答