2009-10-26 75 views
2

如果在別的地方回答了這個問題,請點擊我並指向正確的方向。如何爲依賴同一個罐子的兩個獨立項目設置maven

我是Maven的全新品牌,並試圖圍繞如何在項目中使用它。我有兩個頂級項目,一個是Swing應用程序,另一個是一組Web服務。他們都依賴於相同的內部罐子。有什麼好的方法來爲此設置poms?

如果該jar只被其中一個項目使用,那麼它看起來像我將它放入內部並使其成爲一個模塊。但我不想要兩個(以及更多)的jar源代碼副本。

看起來我可以做到這一點的一種方式是擁有Swing應用程序的主POM,該應用程序具有Swing應用程序和庫jar作爲模塊。然後讓另一個Web應用程序的主POM以同樣的方式設置。這有道理嗎?有更好的方法嗎?

的目錄結構是目前非常簡單:

Development/ 
----SwingApp/ 
----WebServices/ 
----CoreLibrary/ 

了太多的信息和側面的問題如下:

我繼承了「打造系統」(使用術語鬆散)這是100%Netbeans自動生成的螞蟻腳本。我開始嘗試將其納入我非常喜歡的持續集成,TeamCity。我遇到了嚴重的問題,試圖用它構建WebServices項目。據我所知,生成的ant(build-impl.xml)中有些東西不能在CI環境中重寫。將這一切與日常開發中的一些嚴重的classpath混淆在一起,你就開始明白我爲什麼要去maven。

在這個問題中包含的問題之一是開發人員在我的團隊似乎都有的習慣。目前,Netbeans中的各種項目都有對「CoreLibrary」項目的項目引用。這意味着當在「CoreLibrary」中更改源代碼並且開發人員在頂級應用程序上構建時,它還將根據需要構建CoreLibrary。可以在Maven中模擬嗎?這將有助於緩解過渡。到目前爲止,我看到Netbeans(6.7)並沒有用maven構建這樣做,而且我不認爲我可以在Netbeans之外出售(還)日常構建工作。

+0

任何人都有運氣做這種方式:http://chasethedevil.blogspot.com/2007/04/less-productive-with-maven2.html ../guide-ide-eclipse-site ../guide-ide-eclipse-core ../guide-ide-eclipse-module1 Jim 2009-10-26 21:59:07

+0

@jcullison我看過後,你發佈的鏈接的評論。顯然,我不同意作者和評論。我從2003年開始使用Maven,我不知道人們在說什麼。當然,Maven有一點學習曲線,但是一旦你知道如何使用它,Maven是一個非常好的工具,我絕對不會放棄它。人們在帖子中提到的大部分內容都是由於缺乏知識的恕我直言。 – 2009-10-27 00:15:29

+0

但是你有沒有在模塊中使用相對(../project2)引用?你特別不同意那部分? – Jim 2009-10-28 17:02:41

回答

4

在你的開發目錄中,您將有一個POM它看起來像以下:

<project> 
    <groupId>yourGroup</groupId> 
    <artifactId>project</artifactId> 
    <packaging>pom</packaging> 
    <modules> 
     <module>coreLibrary</module> 
     <module>swingApp</module> 
     <module>webServices</module> 
    </modules> 
</project> 

是的,我已經遺漏了一些其他元素,所以填寫你需要的一切完整的pom。

然後,你coreLibrary,swingApp和Web服務模塊將各自有一個父元素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個模塊,或者,甚至更好,你可以使用 - 兼-make選項只建Web服務和它的依賴(在這種情況下coreLibrary)

mvn -am --projects webServices clean install 
+0

我正在試驗這個設置,到目前爲止它運行良好。 – Jim 2009-10-28 17:00:24

+0

好聽。請注意,第二個pom示例基本上就是您的web服務的必備內容。 swingApp看起來幾乎相同,但是具有不同的artifactId。 coreLibrary也會有不同的artifactId,並且不會對任何項目有任何依賴關係,但是您可能已經弄清楚了。 – digitaljoel 2009-10-28 21:10:04

+0

查找更多關於也使選項的信息,我發現這個http://www.sonatype。com/people/2009/10/maven-tips-and-tricks-advanced-reactor-options/ 這正是我開始做的事情。 – Jim 2009-11-02 15:42:28

0

讓每個應用程序和jar庫成爲一個簡單的父級內的模塊。讓這兩個應用程序都依賴於核心,Maven會找出構建事物的順序。

0

我有兩個頂級項目,一個是Swing應用程序,另一個是一組Web服務。他們都依賴於相同的內部罐子。

您是否正在使用自己的Maven存儲庫?如果是這樣,最簡單的方法是簡單地部署公共內部JAR,並使用POM中的<dependency>元素使兩個項目都依賴於JAR。

Nexus是一個非常好用且易於使用的存儲庫,如果您打算使用內部Maven,那麼您無疑需要運行自己的存儲庫,以便實際「發佈」每個項目的版本,庫JAR等等。Repository Management with Nexus是Sonatype的一本免費書,詳細說明如何使用它,最佳實踐等。

+0

我發現Artifactory並在我找到Nexus之前就開始運行了。但我會在接下來再看這個。 – Jim 2009-10-26 21:57:07

3

您不應該將.jars添加到您的項目中。您應該將JAR依賴項添加到您的.pom文件中。 Maven會爲你下載.jars。你將不得不創建。每個內部的.jar文件,聚甲醛,並將其添加到您的Maven倉庫(或代理,如果你有一個。)

+0

我想我對這個概念有很好的把握。但是你的回答並不包括關於日常編譯問題的後半部分。 – Jim 2009-10-26 21:58:25

+2

在Maven世界中,無論何時在CoreLibrary jar中進行更改,都會「釋放」它的新版本(從字面上將版本號上升一級),然後更新從屬項目的POM以引用新的版。 Maven處理剩下的事情。 – 2009-10-27 12:37:52

+1

您可能還想閱讀_SNAPSHOT版本。在您的POM中使用快照版本可讓您告訴maven每次構建時都會獲得.jar的新副本(不會增加版本號)。 請務必刪除最終版本的_SNAPSHOT。 – 2009-10-27 15:07:20

2

從技術上講,有幾種解決方案來實現此版本,但是,取決於這些項目與t之間的耦合程度繼承人的生命週期,你最終可能會選擇一個選項或另一個選項。有些問題可能有助於決定:

  • 誰在構建所有這些項目?一支獨特的團隊?分離的團隊?
  • SwingApp和WebServices之間有任何關係嗎?在構建SwingApp時,構建WebServices有意義嗎?當你發佈SwingApp時,你是否也發佈了WebServices? 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服務模塊將在其pom中聲明的核心庫上有一個<dependency>。在多模塊構建期間,maven使用依賴關係來計算構建順序。

在這種設置中,核心庫將建立前擺動應用網絡服務從頂部項目運行Maven的時候(這就是所謂的多模塊構建或反應器版本)這似乎是期望的行爲。這似乎相當於沒有混亂的本地JAR管理的實際情況(通過maven,依賴項通過「本地存儲庫」進行管理,並且這是一個內置功能)。

注意:如果NetBeans的不喜歡嵌套的模塊,它可以使用平板佈局這樣的(但是這更多的是細節現在):

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

對於實施細節,但Multi Module Project with Eclipse可能幫助你開始的速度非常快,只需跳過Eclipse的具體步驟即可。或者查閱Sonatype的Maven書籍的Chapter 6. A Multi-module Project以獲得「真實」參考。

相關問題