簡體   English   中英

如何為依賴於同一jar的兩個獨立項目設置maven

[英]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存儲庫(或代理,如果您有)。

從技術上講,實現此構建有幾種解決方案,但是,根據這些項目與其生命周期之間的耦合,您最終可能會選擇一個選項或另一個選項。 一些問題可能有助於決定:

  • 誰在建設所有這些項目? 一個獨特的團隊? 分開的團隊?
  • SwingApp和WebServices之間有什么關系嗎? 構建SwingApp時,構建WebServices是否有意義? 當您發布SwingApp時,您是否也發布了Web服務? SwingApp和WebServices項目是否始終使用相同版本的CoreLibrary?
  • 將3個項目組合在一起是否有意義?
  • 單獨構建CoreLibrary是否有意義,並且兩個項目都依賴於生成的jar?

根據提供的信息,我的理解(這可能是錯誤的,它只是一種解釋)是所有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繼承公共部分很有用
  • swing-app和web-services模塊將在其pom中聲明的核心庫上具有<dependency> 在多模塊構建期間,maven使用依賴關系來計算構建順序。

通過這種設置,當從頂級項目(這稱為多模塊構建或反應堆構建)運行Maven時, 核心庫將在swing-appweb-services之前構建,這似乎是所需的行為。 這似乎相當於沒有凌亂的本地JAR管理的實際情況(與maven,依賴關系通過“本地存儲庫”管理,這是一個內置功能)。

注意:如果NetBeans不喜歡嵌套模塊,則可以使用這樣的平面布局(但現在這更詳細):

my-app/           
|-- parent
|   `-- pom.xml       
|-- core-library  
|   `-- pom.xml   
|-- swing-app     
|   `-- pom.xml   
`-- web-services  
    `-- pom.xml

有關實現的詳細信息, 使用EclipseMulti 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM