2009-10-06 96 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个人资料