2013-05-13 48 views
0

我有任務將遺留項目從ant遷移到maven,並且在循環導入時遇到問題。我的問題是螞蟻建立了許多包含相同類的罐子。Maven,循環導入,用於編譯的類路徑

最初的ant項目有一個src文件夾,幷包含所有的軟件包。爲了兼容maven,我需要使用pom.xml將src文件夾分割爲幾個模塊(如指南和手冊中所述)。

快速示例。

Foo.java 
package myapp; 
import my.domain.myapp.Bar; 
... 

Bar.java 
import my.domain.myapp.Foo; 
... 

src/my/domain/myapp/foo/foo.java (foo.jar) 
src/my/domain/myapp/bar/bar.java (bar.jar) 

有2個軟件包放在同一個父包中,編譯時沒有問題。 Ant項目只是編譯Java類,然後通過模式生成工件。所以,編譯* .class只是複製到jar。對於行家餘did't看到同樣的方式,我想我需要拆分包,比如:

pom.xml (parent) 
--foo 
----src/main/java/my/domain/myapp/foo/foo.java 
----pom.xml 
--bar 
----src/main/java/my/domain/myapp/bar/bar.java 
----pom.xml 

所以,行家我知道只有設置依賴性,罐子到另一個罐子。在我的情況下,我已經鎖定構建的循環導入。如果沒有bar.jar,我不能創建foo.jar,反之亦然。

Maven有一些東西可以爲編譯過程指定類路徑變量,而是將依賴關係設置爲jar?一些解決方法?

最好的做法是歡迎。

回答

1

Maven使用Maven時需要注意的一件事是,Maven需要明確定義項目組件(JAR,WAR或其他類型的模塊)。清晰的非循環依賴是先決條件之一。

如果你因爲循環依賴所面臨的問題,也有你需要尋找到的東西: (@matsev的答案提供了相當一些方法,我加入了一些)

  1. foobar真是再合適不過了分裂成單獨的模塊,如果它們需要如此緊密耦合?
  2. 如果你認爲他們應該被放入單獨的模塊,那麼你需要重構你的代碼。根據您的實際情況,有很多不同的方法可以解決您的問題:
    • 介紹接口以便Foo和Bar使用相應的接口,並且可以將接口放入單獨的模塊中(稱爲foo-api或bar -api)
    • 雙調度
    • 任何其他模式,可以幫助您正確設計Foo和Bar,以在Foo和Bar之間給出清晰的關係。沒有人能真正告訴你該怎麼做,因爲這取決於你的需要。只有一件事是明確的:設計有改進的地方。它現在給了大難聞的氣味。
1

我建議你重構代碼以打破循環依賴。根據不同的項目,不同的策略可用於:

  • 是否都FooBar真正需要了解對方嗎?通過刪除其中一個依賴關係,其中一個類將被控制。它知道它自己的狀態,同時它可以詢問另一個類的實例的當前狀態。
  • 使用dependency injection打破打破依賴關係(例如,通過引入新的Bazfoo包,讓Foo取決於Baz,從foo項目到bar項目中刪除的依賴,並讓Bar實施Baz)。
  • observer pattern的介紹可以解耦您的類,而不會丟失跟蹤的變化。