2010-02-12 34 views
26

我正在使用Spring 3和Maven。我在我的pom.xml中定義了所有的spring模塊。爲什麼Spring 3在使用Maven時需要顯式的cglib依賴聲明?

當我使用<aop:scoped-proxy />時,出現CGLIB丟失的錯誤。

嗯...我添加CGLIB在我pom的依賴,這一切運行...

我有點糊塗了...... Maven是一個依賴管理......爲什麼不能下載當我使用spring-aop模塊時CGLIB?

這不是唯一的情況......爲什麼有些項目需要顯式依賴聲明而不是使用Maven傳遞依賴機制?

+0

@Jerome C.你不能指望maven自己找到所有東西,它不是一件神奇的事情,因爲有時候一些依賴關係不在存儲庫中,有時你需要手動下載它們。然而,它應該自己下載依賴關係,但它沒有,Maven遠非完美,但它是所有其他構建工具中最接近的(儘管maven不僅僅是構建工具)。 – ant 2010-02-12 16:29:05

+0

@Pascal Thivent嗯,我想你好想理解的我的意見還是我寫的不理解的方式,因爲: 1. Maven會找到一個依賴,如果它是提供一個存儲庫,如果聚甲醛包含必需的信息 - 」 .. ,因爲有時候一些依賴不上的倉庫存在「 2.但在春季和CGLIB的情況下,CGLIB是一個可選的依賴所以,除非你明確指定它,你不會得到它 - 」好了,你不能指望maven自己找到所有東西,它不是一個神奇的東西「 - >正如你所說,因爲它是一個可選的依賴關係,它不會找到它。當我被錯 – ant 2010-02-12 22:21:15

+0

@Pascal Thivent反正我剛開始使用Maven幾個星期前,它的非常好的工具/平臺的,但每個人都知道你是遠有經驗的用戶,他們應該使用常識,並得出結論,您的文章/評論可能會比我更正確。我個人喜歡閱讀關於Maven的文章/評論,因爲它們總是有用,所以不要誤解它。歡呼聲 – ant 2010-02-12 22:22:31

回答

50

這是因爲cglib被標記爲optional dependency

基本上,你不需要每個使用spring-aop庫的cglib,所以maven不會自動下載它。不幸的是,你需要手動指定它。

+0

+1你的答案 – ant 2010-02-12 16:32:34

+0

確切的說,我才發現可選功能) 但是,當一個依賴聲明爲可選的,它只是一個文檔?或者有一種方法可以在模塊聲明中激活它? – 2010-02-12 16:39:15

+1

@Jerome據我瞭解,依賴關係是在他們構建spring-aop時下載的,而不是在您建立依賴spring-aop的項目時下載的。如果這是有道理的! – 2010-02-12 16:57:05

5

我的猜測是cglib is not enabled in Spring by default。因此,除非您明確啓用它,否則它不會包含在pom中。

據我所知,Maven無法進入您的Spring配置文件並確定是否需要額外的可選庫。雖然,這聽起來像是一個很酷的Spring-Maven插件,如果可以通過插件修改pom的話。不知道是否是,但它會很酷。

17

我有點困惑... Maven是一個依賴管理器...爲什麼當我使用spring-aop模塊時不下載cglib?

因爲不是每個人都使用CGLIB(在Spring AOP代理可以是JDK動態代理或者CGLIB代理),所以CGLIB被標記爲在spring-aop的POM的optional的依賴,你有,如果你明確地添加它想要使用它。這正是可選的依賴關係。

另一個類似的例子是Hibernate,它允許您以相同的方式在hibernate-core之間選擇cglib和javassist。 Hibernate還允許您在各種連接池(如果您決定使用其中一個)或緩存提供程序(只有ehcache,默認值,未聲明爲可選)之間使用choose

2

好消息 - 這是過去的問題:

在Spring 3.2中,不再需要CGLIB添加到您的 項目的類路徑,因爲CGLIB類是在 組織重新包裝.springframework並直接包含在彈簧核心JAR中​​。這個 意味着基於CGLIB的代理支持的工作方式與JDK動態代理始終具有的方式相同。

瞭解更多here

+0

如此之大;) – 2015-07-30 16:08:40

相關問題