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

第一个解决方案是显式地将 Hibernate 的 CGLIB jar 替换为 nodep 版本(Spring 发行版中提供了一个),其中包含 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 Andersen错误报告 中评论的那样。

解决方案 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 社区中所有即将举行的活动。

查看全部