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 功能中。

更新:請先閱讀解決方案三!

解決方案一

第一種解決方案是明確地將 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>

解決方案二

我沒有嘗試過這種方法,但根據 Hibernate JIRA,您可以將 Hibernate 的位元組碼提供者變更為 Javassist,如 Max Rydahl Andersen錯誤報告中所述。

解決方案三 (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 社群中所有即將到來的活動。

查看全部