0

我有一个曾经在许多 Web 服务器(tomcat、jboss、weblogic 和 websphere)上运行良好的 Web 应用程序。但是,现在在 WebSphere 9 上部署时出现错误。

该应用程序包含 jar javax.transaction-api-1.2。它的一些类,例如 ,javax.transaction.xa.XAResource也包含在 Java SE 中,但不是全部。有些是 Java EE 特有的,并且是我的应用程序中的一些 3rd-party 库所必需的。该应用程序始终使用子优先(父最后)类加载器进行部署。当应用程序尝试加载 Oracle JDBC 驱动程序时,WebSphere 9 在启动期间抛出此错误:

java.lang.LinkageError: loading constraint violation: loader "com/ibm/ws/classloader/CompoundClassLoader@7157be44" previously initiated loading for a different type with name 
"javax/transaction/xa/XAResource" defined by loader "com/ibm/oti/vm/BootstrapClassLoader@422c7b1b"

请注意,我们实际上并没有在应用程序中使用 XA 事务,而是使用常规事务。

在其他服务器和先前版本的 WebSphere 上,这从来都不是问题。服务器并不关心我们XAResource是从战争内部加载的,即使它之前是在服务器的某个地方加载的。现在 WebSphere 9 不同了,它说应用程序类加载器已经从服务器加载了这个类,但我不知道为什么或何时发生这种情况。

知道如何解决这个问题吗?

4

2 回答 2

1

从您的应用程序中删除事务 API。JTA 1.2 已经包含在服务器中,并且在您的应用程序中没有任何价值。除非您 100% 确定它们在技术上是必要的,否则将 Java EE/SE API 引入最后一个父类加载器总是有风险的,因为它们可能会导致类似这样的问题。

我不能说这在以前的服务器版本中是如何工作的(在执行这样的链接问题方面有一些 Java 级别的变化),但解决方案相当简单。

于 2020-03-24T13:03:49.293 回答
0

最后我们做了两件事来解决这个问题。

1)我们将 jta jar 升级到 1.3 版(链接在这里)。这个 jar 通过避免重复类解决了这个问题——它只包含 J2EE 类并省略了已经包含在 JVM 中的 J2SE 类。2) 我们将 WebSphere 服务器从 9.0.0.7 升级到 9.0.0.11。

当时,我怀疑只升级 jar 就足够了,但我们的 QA 遇到了一些问题,他们还升级了服务器。由于时间不够,我们没有进一步调查,只是决定两者都做。

于 2020-05-06T14:00:47.530 回答