ASM 版本不兼容,将 Spring @Autowired 与 Hibernate 结合使用

工程 | Alef Arendsen | 2007 年 6 月 11 日 | ...

这周我和 Joris 一起研究 Spring 2.1 的东西。 我们正在准备一个示例,使用全部三种方式依赖注入。 该示例不仅突出了依赖注入,还展示了基于 Hibernate 的后端。

Spring 2.1 中的几个特性需要 ASM 字节码操作框架。 Hibernate 也通过 CGLIB 使用 ASM。 ASM 1.5.3 和 2.2.3 之间存在二进制不兼容。 前者被 Hibernate 使用,后者被 Spring 在各种场景中使用; 特别是在一些 AOP 功能和新的 @Autowired 特性中。

更新:先阅读解决方案 3!

解决方案 1

第一个解决方案是显式地用一个nodep版本(可以从 Spring 发行版获得)替换 Hibernate 的 CGLIB jar,该版本包含一个重新打包的 ASM 1.5.3 版本。 使用 Maven,这需要你在 Hibernate 依赖项旁边放置一些排除项,并显式地在你的pom中放入 ASM 2.2.3 依赖项。

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate</artifactId>
	<version>3.2.1.ga</version>
	<exclusions>
		<exclusion>
			<groupId>asm</groupId>
			<artifactId>asm</artifactId>
		</exclusion>
		<exclusion>
			<groupId>asm</groupId>
			<artifactId>asm-attrs</artifactId>
		</exclusion>				
	</exclusions>
</dependency>

<dependency>
	<groupId>asm</groupId>
	<artifactId>asm</artifactId>
	<version>2.2.3</version>			
</dependency>

解决方案 2

我没有尝试过,但是根据 Hibernate JIRA,你可以将 Hibernate 的字节码提供程序更改为 Javassist,正如 Max Rydahl Andersenbug 报告中评论的那样。

解决方案 3(2007 年 10 月 18 日添加)

从 Spring 2.5rc1 开始,spring.jar 包含 ASM 2.2.3(使用 Jar Jar Links(这个名字!!!!! :) )重新打包)。 这意味着从现在开始,与其他使用 ASM 的项目的所有不兼容问题都应该成为过去。 我还没有尝试过,所以你应该自己弄清楚。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

遥遥领先

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区中所有即将到来的活动。

查看全部