【问题标题】:LinkageError jdbc.datasource.DataSourceTransactionManagerLinkageError jdbc.datasource.DataSourceTransactionManager
【发布时间】:2013-07-16 09:15:08
【问题描述】:

我遇到了这个链接错误的问题,我们的项目具有相同的代码并且可以工作:

this.plateformTransactionManager = new DataSourceTransactionManager();
this.plateformTransactionManager.setDataSource(dataSource);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = plateformTransactionManager.getTransaction(def);

运行时的堆栈跟踪:

java.lang.LinkageError: loader constraint violation: when resolving method org.springframework.jdbc.datasource.DataSourceTransactionManager.getTransaction(Lorg/springframework/transaction/TransactionDefinition;)  Lorg/springframework/transaction/TransactionStatus;" the class loader    (instance of  org/apache/catalina/loader/WebappClassLoader) of the current class, com/as24/referentiel/daos/ExternalUserDAO, and the class loader (instance of  rg/apache/catalina/loader/StandardClassLoader) for resolved class,  org/springframework/jdbc/datasource/DataSourceTransactionManager, have different Class Objects for the type org/springframework/transaction/TransactionDefinition used in the Signature

我读到这是一个 maven 依赖错误,但我们只在 3.0.7.REALEASE 版本上使用了 Spring

我在网上找不到任何解决方案...

【问题讨论】:

  • 你能说明你是如何获得dataSource的吗?

标签: java spring transactions linkageerror


【解决方案1】:

这是服务器和 Web 应用程序之间共享库的问题。

在java中,一个类由它的name(包括包名)和它的类加载器(加载它)来标识。因此,如果您在 Web 应用程序 WEB-INF/classes${catalina.home}/lib 中具有相同的 MyBean.class,则它们将被视为两个不同的类(即 myBean instanceof MyBean == false)。当 JVM 接近某些类在其方法签名中使用类 XYZ 并且 XYZ 由与已知的类 XYZ 不同的类加载器加载的情况时当前类加载器,然后引发LinkageError


您的问题是您在共享/系统类加载器以及 Web 应用程序依赖项中有 Spring 依赖项(至少 spring-tx)。

要解决您的问题,您需要执行以下操作之一:

  • 从服务器类加载器中删除 Spring 依赖项
  • 从 Web 应用程序中删除重复的依赖项(在 POM 中将其标记为 provided 依赖项)
  • endorsed 类加载器上添加重复依赖项(通过该Web 应用程序类加载器将忽略Web 应用程序依赖项)。

【讨论】:

  • 我检查了我的 WEB-INF/lib 和 catalina.home:spring-jdbc 仅在 catalina.home 上,依赖于子项目而不包含在主项目中
  • @FrancoisT 例外很明显。毫无疑问,spring-tx 被两个不同的类加载器加载(或者 TransactionDefinition 在以前的 Spring 版本中被打包在不同的 JAR 中)是毫无疑问的。检查您的服务器配置。
  • 问题是 spring-tx 而不是我想的 spring-jdbc
  • 有一个简单的规则 - 每个依赖项都应该在服务器类加载器路径或 webapp 类加载器路径中。永远不要在两个类加载器的路径上(除非你 100% 确定这是你想要的)。所以还要检查其他依赖项......如果有任何重复,那只是另一个等待发生的隐藏问题。
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 2015-08-29
  • 2010-10-18
  • 1970-01-01
  • 2023-03-07
  • 2016-07-16
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多