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

查看所有