WebSphere9上javax.transaction.*类的LinkageError

WebSphere9上javax.transaction.*类的LinkageError,websphere,linkageerror,Websphere,Linkageerror,我有一个web应用程序,它过去在许多web服务器(tomcat、jboss、weblogic和websphere)上运行良好。但是,现在在WebSphere9上部署时出现了一个错误 该应用程序包含jarjavax.transaction-api-1.2。它的一些类,例如,javax.transaction.xa.XAResource,也包含在JavaSE中,但不是全部。有些是Java EE特有的,是我的应用程序中某些第三方库所必需的。应用程序始终使用子级优先(父级最后)类加载器进行部署。 当应用

我有一个web应用程序,它过去在许多web服务器(tomcat、jboss、weblogic和websphere)上运行良好。但是,现在在WebSphere9上部署时出现了一个错误

该应用程序包含jarjavax.transaction-api-1.2。它的一些类,例如,
javax.transaction.xa.XAResource
,也包含在JavaSE中,但不是全部。有些是Java EE特有的,是我的应用程序中某些第三方库所必需的。应用程序始终使用子级优先(父级最后)类加载器进行部署。 当应用程序尝试加载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
,即使它以前加载在服务器的某个地方。现在WebSphere9不同了,它说AppClassLoader已经从服务器加载了这个类,但是我不知道为什么或者什么时候会发生这种情况


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

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


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

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

1) 我们将jta jar升级到1.3版(link)。这个jar通过避免重复类来解决这个问题——它只包含J2EE类,而忽略了JVM中已经包含的J2SE类。 2) 我们将WebSphereServer从9.0.0.7升级到9.0.0.11


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

我需要用于其他服务器的jar,而jta没有提供。我正试图避免为不同的服务器使用不同的war归档是否有一个技术原因,即您使用父级最后一个类装入器策略运行?你只需要在你的应用程序中有特定的东西,你绝对需要使用你的版本优先于服务器的版本。使用parent last时,发生链接错误的风险要高出几个数量级,因为它使一个类更有可能由多个类加载器定义。当然,这有一个技术原因-parent first class loader使我们的应用程序容易受到服务器环境变化及其库中错误的影响。考虑到j2ee和许多不同服务器的发展,我们在这个应用程序中使用ParentLast已经有15年了。使用ParentLast给我们提供了隔离和稳定性,到目前为止,它一直有效。它也适用于jboss和weblogic,以及以前版本的websphere(以及没有jta的tomcat)