2

背景:我有以下问题:我有几个 WAR 文件需要部署在同一个 Websphere 服务器上。WAR 文件使用的库依赖于将特定版本的 XMLSec 注册为 XML 签名提供者(使用 Java 安全类)。目前我将这个库与每个 WAR 文件捆绑在一起(因为 WAR 文件也需要独立工作,并且在 Tomcat 上没有任何特殊的共享库配置等)。每个 WAR 文件在 ServerContextListener 中使用 Security.addProvider() 注册提供程序。但这会导致多 WAR 设置出现问题,因为如果一个 WAR 文件使用 Security.addProvider 进行注册,而另一个 WAR 文件尝试使用 XMLSignatureFactory 类(实际上是 XMLSec JAR 中包含的 javax.* 类)来获取它本身,但它最终回调到使用 Security.addProvider 配置的全局提供程序列表),然后它会在 XMLSignatureFactory 中导致 ClassCastException,因为这个类将它从 Security 获取的内容转换为它自己的提供程序类版本,这不会不工作。确切的堆栈跟踪如下:

引起:java.lang.ClassCastException:org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory 与 javax.xml.crypto.dsig.XMLSignatureFactory 在 javax.xml.crypto.dsig.XMLSignatureFactory.findInstance(XMLSignatureFactory. java:202) 在 javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(XMLSignatureFactory.java:292)

顺便说一句,这不是与正在运行的不同版本的 XMLSec 冲突或与 Websphere 自己的版本发生冲突的情况。只有一个版本,尽管它是从不同的 WAR 加载的。

当然,解决方案是使用通用类加载器加载 xmlsec 库,这样所有 WAR 文件都可以看到加载的类的一个版本,这将避免 ClassCastExceptions 等。但问题是:我还需要有每个应用程序都加载了“最后一个父”策略——或者更确切地说,我需要每个应用程序中的 JAR 文件优先于 Websphere 的内置版本的库(例如我也包含在 WAR 文件中的 Axis2 等)。此外,我希望我可以将 xmlsec 库保存在每个 WAR 文件的 WEB-INF/lib 文件夹中,以便 WAR 文件仍然可以独立工作(即在其他可能没有配置共享库的环境中等)。 )。

所以基本上我想要一个通用的类加载器来加载 XMLSec 库,比如说,从磁盘的某个地方。让我们表示[SHARED XMLSEC]。然后我希望每个应用程序类路径最终看起来像这样:

App1:[SHARED XMLSEC][App1 WEB-inf/lib][Websphere 库][JDK 库]

App2:[SHARED XMLSEC][App2 WEB-inf/lib][Websphere 库][JDK 库]

等等

在这样的配置中,App1+App2 本身是否包含 XMLSec 库并不重要,因为共享的将优先,因此它们将使用公共的。同时,App1+App2 仍然可以自由覆盖其他内置的 Websphere 库(Axis2)。

是否可以实现此配置以及我需要设置哪些选项?您是否看到实现相同目标的替代方法?

4

1 回答 1

0

由于您在这里的类之间存在冲突,我建议为每个应用程序使用隔离的类加载器。在服务器端,将类加载器策略设置为“多个”应该提供应用程序之间的隔离。

完成此设置后,将应用程序级别的类加载配置为两个应用程序的“最后一个父级”配置。

以下知识中心链接包含相关说明 [“过程”部分下的步骤 2、3 和 4]: http://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere。 nd.multiplatform.doc/ae/trun_classload.html

[注意:问题中未指定正在使用的 WAS 版本。知识中心链接是指版本 8.5.5。]

于 2016-06-02T12:17:29.520 回答