2009-10-06 98 views
5

我有一個多模塊項目,我想定義一個過濾器文件,將所有的子模塊應用屬性。例如,我想有以下結構:如何在Maven2模塊之間共享過濾器文件?


- filter.properties
- 模塊1
    - 資源1
- 模塊2
    - 資源2

這樣當我bu ild父親,當子模塊被構建時它會將過濾器應用於resource1和resource2。

如果我創建上面的結構並在父級的POM中定義過濾器,則構建失敗,因爲它期望在每個子模塊中定義過濾器......是否有一種簡單的方法可以做到這一點, ?

回答

4

This answer描述如何擴展properties-maven-plugin以允許在項目之間共享屬性文件。如果使用該插件,那麼這些屬性將可用於構建,因此可以在過濾資源時使用。

或者,您可以在某些構建中指定過濾器文件作爲附加構件,以便它在存儲庫中可用,然後使用依賴項插件下載過濾器文件,最後指定過濾器使用共享文件。

到過濾器連接到你的父生成,使用build-helper-maven-plugin的附加目標:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <id>attach-artifacts</id> 
     <phase>package</phase> 
     <goals> 
      <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
      <artifacts> 
      <artifact> 
       <file>src/main/resources/shared-filter.properties</file> 
       <type>properties</type> 
       <classifier>filter</classifier> 
      </artifact> 
      </artifacts> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

當託管過濾器項目部署,過濾器現在將沿着它連接。

要下載過濾器文件到您的項目,使用maven-dependency-plugin的複製依賴目標要下載的文件:

<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>copy</id> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>copy</goal> 
     </goals> 
     <configuration> 
      <artifactItems> 
      <artifactItem> 
       <groupId>name.seller.rich</groupId> 
       <artifactId>shared</artifactId> 
       <version>1.0.0</version> 
       <classifier>filter</classifier> 
       <type>properties</type> 
       <overWrite>false</overWrite> 
       <destFileName>shared-filter.properties</destFileName> 
      </artifactItem> 
      </artifactItems> 
      <outputDirectory> 
      ${project.build.directory}/filters 
      </outputDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

如果相關插件的配置在你的父項目中定義的所有其他項目可以繼承配置,不需要重新定義它。

然後使用下載的過濾器:

<filters> 
    <filter>${project.build.directory}/filters/shared-filter.properties</filter> 
</filters> 
<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    </resource> 
</resources> 
+0

+1不錯答案豐富。曾聽說過這個:http://www.mail-archive.com/[email protected]/msg00202.html? – 2009-10-06 22:07:45

+0

謝謝里奇,這應該爲我工作。不是像我希望的那樣簡單:) – David 2009-10-06 22:32:39

+0

我嘗試了上面的解決方案,它部分工作。當我嘗試執行mvn安裝時,它會複製資源,但最終還會嘗試將它們部署到存儲庫,並在此期間在子模塊的src/main/resource中查找資源,並且我得到以下例外 – user373201 2011-01-03 04:55:01

4

我不知道這是一種選擇,但不是在外部文件中定義的屬性,你也可以在屬性部分定義它們您pom.xml,你會得到同樣的效果:

<project> 
    ... 
    <properties> 
    <my.filter.value>hello</my.filter.value> 
    </properties> 
</project> 

因此,在父POM定義<properties>應該讓你輕鬆過濾子模塊。

+0

+1爲簡單的方法 – 2009-10-07 11:38:34

0

你也可以在你父母的pom.xml

由於路徑使用過濾器的絕對路徑共享過濾器是依賴於環境(日食窗/月食的Linux/buildserver),你可以把路徑前綴或者其中的一部分。xml個人資料