[英]How to set up maven for two separate projects that depend on the same jar
如果在其他地方回答這個問題,請指責我並指出正確的方向。
我是Maven的新手,並試圖將我的頭腦與我的項目一起使用。 我有兩個頂級項目,一個是Swing應用程序,另一個是一組Web服務。 它們都依賴於同一個內部罐子。 有什么好方法可以為此設置poms?
如果jar只被其中一個項目使用,那么看起來我會把它移到里面並使它成為一個模塊。 但是我不想要那個jar的源代碼的兩個(以及更多)副本。
看起來我可以這樣做的一種方法是為Swing應用程序提供一個主pom,其中包含Swing應用程序和庫jar作為模塊。 然后為Web應用程序設置另一個主pom以相同的方式設置。 那會有意義嗎? 還有更好的方法嗎?
目錄結構目前非常簡單:
Development/
----SwingApp/
----WebServices/
----CoreLibrary/
方式太多信息和附帶問題如下:
我繼承了一個“構建系統”(使用松散術語),它是100%Netbeans自動生成的ant腳本。 我開始嘗試將它放入持續集成,TeamCity,我非常喜歡。 我試圖用它來構建WebServices項目時遇到了嚴重的問題。 在我所知道的情況下,生成的ant(build-impl.xml)中有些東西無法在CI環境中被覆蓋。 在日常開發中將這與一些嚴重的類路徑地獄相結合,你就會開始明白我為什么要去找maven。
這個問題包含的一個問題是我的團隊中的開發人員似乎都習慣了。 現在,Netbeans中的各個項目都有對“CoreLibrary”項目的項目引用。 這意味着當在“CoreLibrary”中更改源代碼並且開發人員在頂級應用程序上進行構建時,它還將根據需要構建CoreLibrary。 可以在Maven中模擬嗎? 這將有助於緩解過渡。 到目前為止,我看到Netbeans(6.7)沒有使用maven版本,我認為我不能賣掉(還)在Netbeans之外進行日常構建工作。
在您的開發目錄中,您將擁有一個類似於以下內容的pom:
<project>
<groupId>yourGroup</groupId>
<artifactId>project</artifactId>
<packaging>pom</packaging>
<modules>
<module>coreLibrary</module>
<module>swingApp</module>
<module>webServices</module>
</modules>
</project>
是的,我已經遺漏了其他一些元素,所以填寫你需要的任何其他元素。
然后,您的coreLibrary,swingApp和webServices模塊將各自具有一個帶有父元素的pom,以及任何依賴項,如下所示
<project>
<parent>
<groupId>yourGroup</groupId>
<artifactId>project</artifactId>
<version>yourVersion</version>
</parent>
<artifactId>webServices</artifactId>
<packaging>war</packaging>
<version>yourVersion</version>
<dependencies>
<dependency>
<groupId>yourGroup</groupId>
<artifactId>coreLibrary</artifactId>
<version>yourVersion</version>
</dependency>
</dependencies>
</project>
如果你在根級別構建,那么它將構建所有3個模塊,或者更好的是,你可以使用--also-make選項來僅構建webServices及其依賴項(在本例中為coreLibrary)
mvn -am --projects webServices clean install
您不應該將.jars添加到項目中。 您應該將JAR依賴項添加到.pom文件中。 Maven將為您下載.jars。 您必須為每個內部.jar創建.pom文件,並將它們添加到您的maven存儲庫(或代理,如果您有)。
從技術上講,實現此構建有幾種解決方案,但是,根據這些項目與其生命周期之間的耦合,您最終可能會選擇一個選項或另一個選項。 一些問題可能有助於決定:
根據提供的信息,我的理解(這可能是錯誤的,它只是一種解釋)是所有3個項目實際上是由同一個人緊密耦合和開發的。 修改核心庫后,將重建依賴項目。 所以,我建議以下多模塊項目:
my-app/ // this is the parent module, it aggregates the child modules |-- pom.xml |-- core-library | `-- pom.xml |-- swing-app // this module has a dependency on core-library | `-- pom.xml `-- web-services // this module has a dependency on core-library `-- pom.xml
我們的想法是將所有項目放在父模塊下,並使用項目聚合和項目繼承:
pom
類型的包裝,並聲明一個包含所有3個子模塊的<modules>
元素。 通過這樣做,父項目現在知道它的模塊,並且如果針對父項目調用Maven命令,那么Maven命令也將被執行到父模塊。 <parent>
。 這對於從父pom繼承公共部分很有用 <dependency>
。 在多模塊構建期間,maven使用依賴關系來計算構建順序。 通過這種設置,當從頂級項目(這稱為多模塊構建或反應堆構建)運行Maven時, 核心庫將在swing-app和web-services之前構建,這似乎是所需的行為。 這似乎相當於沒有凌亂的本地JAR管理的實際情況(與maven,依賴關系通過“本地存儲庫”管理,這是一個內置功能)。
注意:如果NetBeans不喜歡嵌套模塊,則可以使用這樣的平面布局(但現在這更詳細):
my-app/ |-- parent | `-- pom.xml |-- core-library | `-- pom.xml |-- swing-app | `-- pom.xml `-- web-services `-- pom.xml
有關實現的詳細信息, 使用Eclipse的Multi Module Project可能會幫助您快速入門,只需跳過Eclipse特定的步驟即可。 或者查看第6章 .Sonatype的Maven書的多模塊項目 ,以獲得“真實”參考。
讓每個應用程序和jar庫成為一個普通父類中的模塊。 讓兩個應用程序都依賴於核心,maven將確定構建內容的順序。
我有兩個頂級項目,一個是Swing應用程序,另一個是一組Web服務。 它們都依賴於同一個內部罐子。
您使用自己的Maven存儲庫嗎? 如果是這樣,最簡單的選擇是簡單地部署公共內部JAR,並使用POM中的<dependency>
元素使兩個項目依賴於JAR。
關系是一個真正偉大的和易於使用的存儲庫,如果你要使用Maven內部,那么你將毫無疑問要經營自己的倉庫,所以你其實可以每一個項目,庫JAR等發布的“”版本庫使用Nexus進行管理是Sonatype的免費書籍,詳細介紹了如何使用它,最佳實踐等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.