2011-05-27 166 views
1

我有一堆屬於同一團隊的頂級包。所有頂層包裝均使用彈簧。然後有一些庫(jar)是頂層包之間共享的功能和實用程序。所有漂亮的標準東西。處理彈簧依賴關係

在某些情況下是有意義的利用彈簧的一個庫包。假設我有一系列共享的方面,我想使用spring的@Aspect/@ Before/@ After等註釋。

問題是有相當大的頂級包使用spring 2.5.6依賴關係編寫,而較新的頂級包是在spring 3中創建的。我通常認爲這是件好事。

但再有就是這個小問題,我現在有一個依靠彈簧2.5.6庫,而那些不能因爲誤匹配版本的彈簧3頂層封裝中使用(我在做這裏假設吮吸兩種不同的彈簧版本是一個非常糟糕的想法)。看起來我的選擇是避免庫中的彈簧依賴,或者接受我的庫需要提供多個版本(每個版本的彈簧在頂層包中使用1)。選項1似乎比選項2更可取,但我希望有一些有趣的技巧可以讓我獲得兩全其美的好處。

如果有一些這些事情Java標準(@注入?),那麼我可以依靠的東西的javax而不是在春天具體的東西。不幸的是,@Inject等只支持Spring3 +,以便在未來的某個時間修復我的問題,但只要我有2.5.6的應用程序,它不會幫助。

想法?

我要指出,有依賴於彈簧2.5.6現有的一些庫和我認爲,作爲一個威懾升級頂級包去春來-3。因爲升級頂層包也意味着版本會碰撞依賴於spring的N庫,這是令人討厭的,因爲我甚至都不知道這些庫的完整用戶集以及他們可能認爲春季版突然被碰撞。

編輯:

我想知道如果我可以創造一些庫,並與範圍彈簧依賴提供。春天版本是我可以選擇的最小版本,以便獲得我想要的功能集,所以理想情況下我會使用2.5.6以使其與Spring 2.5.6應用程序和Spring 3.0.5應用程序兼容。然後當一個消費應用程序在我的庫上創建一個依賴項時,它也會爲該應用程序的實際spring版本創建一個spring依賴項。我認爲這應該工作,只要春天版本是> =我爲我的圖書館選擇的版本(我碰巧知道2.5.6是所有應用程序使用的最低版本)。

我的另一種選擇是不建立在所有彈簧的依賴,但確實提供了可以在調用應用程序中導入一個spring.xml。這意味着我不能使用註釋或InitializingBean之類的東西,但通常spring已經提供了一種通過註釋或xml或兩者來執行的方法,所以這也應該可以工作。

想法?

+0

+1:好問題 – Nilesh 2011-05-27 18:03:24

回答

2

正如你剛纔提到的,同時擁有2.5.6和3。0 Spring依賴關係會產生問題。在運行時只會選擇一個版本,這意味着您的頂級打包模塊將失敗或其他共享實用程序將失敗(取決於Spring的版本)。

Java Classloader - how to reference different versions of a jar中討論了類似的問題。它與Spring沒有直接關係,但我想不出直接解決你的問題。 OSGi是一種可行的解決方案,但不確定它在您的環境中的可行性,因爲它需要對容器本身進行更改。

+0

你能評論我編輯的問題嗎? – Kevin 2011-05-27 18:18:56

+0

@Kevin:提到你的第一次編輯 - 我認爲這種方法仍然行不通。只要這兩個jar文件都是同一個應用程序(WAR/EAR)的一部分,就必須提供2.5.6和3.0版本。將Maven依賴範圍設置爲「提供」將簡單地將jar文件檢查延遲到運行時。所以你最終會得到一個不推薦的兩種版本的Spring環境。只有選項可以使兩個Jars與單個Spring版本兼容。不確定是否有更好的解決方案來解決這個問題 – Vijay 2011-05-30 04:17:32

0

a)@Aspect@Before@After:這些註釋都在aspectjrt.jar中,而不是Spring本身。他們應該有兩個版本

B)@Inject不會工作,但@Autowired會工作。

+0

好吧,也許是壞的例子。比方說,我使用@Component和@Autowired。我想知道,如果我的庫應該對最低版本的Spring版本(比如2.5.6)有一個maven依賴關係作爲提供的依賴項。然後,頂級應用程序可以使用任何版本2.5.6 +。 – Kevin 2011-05-27 16:16:01