2010-07-26 66 views
6

示例場景:我有2個項目「common-project」和「application-project」。應用程序項目取決於common-project提供的API。這兩個項目也有第三方的罐子(例如番石榴)。使用m2eclipse進行多個項目設置的最佳實踐

我想轉換到使用maven和m2eclipse,但我不清楚最好的方法。目前,我的maven-free安裝程序已將第三方jar添加爲common-project中的庫,並標記爲「已導出」。這樣它們就被應用程序項目繼承了,我不必在應用程序項目中將它們明確地添加爲庫。這兩個項目都在積極開發之中,因此我寧願不必首先構建一個common-project jar,然後在我可以在應用程序項目中使用新功能之前將其「安裝」到我的本地存儲庫。

這種類型的項目佈局的推薦方法是什麼?我看到下面的線程大致觸及的話題: Project in Eclipse that builds a jar used by another project in Eclipse

感謝

回答

0

快速,每個項目在POM的<dependencies>元素的依賴關係。

然後,m2eclipse插件會自動從pom.xml中選擇這些插件,並將它們作爲庫引用添加到Eclipse中的構建路徑中。

如果application-project依賴於common-project,那麼它也會繼承它的依賴關係 - 不需要在application-project的pom.xml中第二次列出兩個公共依賴關係。

0

假設你已經在你的計算機上安裝了maven,然後下載m2eclipse pluging安裝它並重新啓動eclipse。

記住maven構建的目標是生成可以分發和重用的構件,如果在您擁有某種穩定版本的「common-project」API之前不想製作mvn install,儘管在開發過程中沒有任何錯誤。

對於你的情況,你可以做下列操作之一:

  1. 如果common-project API是絕對必要的,並往往不是隻能在application-project的範圍使用,那麼構建項目作爲多模塊項目並將common-project聲明爲您的application project的模塊。 Here is an example of how to do this.
  2. 如果否則common-project將更多的時候不是一個共享的工件,然後建立每個獨立的項目,並在它們的pom.xml文件中聲明兩者的依賴關係.eclipse應該能夠找出兩者之間的依賴關係。
  3. 您可以首先開發common-project的部分實現,然後將其打包,然後聲明application-project中的依賴關係,<scope>system<scope>指定它位於的文件系統中的哪個位置,不要在任何存儲庫中查看它;儘管做一個mvn install會比你想要避免的更優雅。

問候。

+0

謝謝 - 我想我應該讓common-project成爲一個共享的工件,並看看它是如何工作的。看起來我仍然可以使用eclipse設置項目依賴關係,這樣重構仍然可以應用於多個項目。 – MavenN00b 2010-07-26 20:00:04

+0

我完全反對使用'system'範圍的依賴關係,這是一個非常糟糕的做法,不應該鼓勵,人們只是濫用它。 – 2010-07-26 21:33:51

4

示例場景:我有2個項目,「common-project」和「application-project」。應用程序項目取決於common-project提供的API。這兩個項目也有第三方的罐子(例如番石榴)。

我將創建3個Maven項目:一個parent聚集模塊,common-project模塊和application-project模塊根據common-project並宣佈番石榴爲parent模塊(這樣子項目將繼承它)的依賴。事情是這樣的:

 
$ tree Q3337426 
Q3337426 
├── application-project 
│   ├── pom.xml 
│   └── src 
│    ├── main 
│   └── ... 
│    └── test 
│     └── ... 
├── common-project 
│   ├── pom.xml 
│   └── src 
│    ├── main 
│   └── ... 
│    └── test 
│   └── ... 
└── pom.xml 

當母體的pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow.Q3337426</groupId> 
    <artifactId>Q3337426</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>Q3337426 - Root</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>r05</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    <modules> 
    <module>common-project</module> 
    <module>application-project</module> 
    </modules> 
</project> 

爲共同項目的pom.xml中:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>Q3337426</artifactId> 
    <groupId>com.stackoverflow.Q3337426</groupId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>common-project</artifactId> 
    <name>Q3337426 - Common Project</name> 
    <dependencies/> 
</project> 

pom.xml中的應用項目:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>Q3337426</artifactId> 
    <groupId>com.stackoverflow.Q3337426</groupId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>application-project</artifactId> 
    <name>Q3337426 - Application Project</name> 
    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>common-project</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 
</project> 

這是Maven組織這樣一個項目的方式,並且允許從根項目觸發反應堆構建來構建一切。

(...)這兩個項目都在積極開發中,所以我寧願不必首先構建一個common-project jar,然後「安裝」到我的本地存儲庫,然後才能使用新的應用程序項目中的功能。

m2eclipse插件可以從工作區項目解決依賴(這實際上是默認行爲)。因此,如果您同時導入application-projectcommon-project,則前者將被配置爲取決於common-project(取決於廣告瓶)的。使用此設置時,對common-project所做的更改將立即可見。

這應該解決您在IDE內部的問題。在IDE之外,在頂部項目上運行反應堆構建。

+0

感謝您的全面迴應,我一定會對此進行調查。 – MavenN00b 2010-07-27 21:10:12

+0

@ MavenN00b:不客氣。應該很容易適應你的真實項目。隨意問你是否需要澄清。 – 2010-07-27 21:17:05