如何在Maven2模块之间共享过滤器文件?

6
我有一个多模块项目,我想定义一个单一的过滤文件,将属性应用于所有子模块。例如,我希望有以下结构: parent - filter.properties - module1     - resource1 - module2    - resource2
这样,当我构建parent时,它会在构建子模块时将filter应用于resource1和resource2。
如果我创建上述结构并在父POM中定义filter,则构建将失败,因为它期望在每个子模块中定义filter... 我是否忽略了一种简单的方法来做到这一点?
3个回答

4

这篇答案介绍了如何扩展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的copy-dependencies目标来下载该文件:
  <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>

+1 不错的回答 Rich。你听说过这个吗?http://www.mail-archive.com/announce@maven.apache.org/msg00202.html? - Pascal Thivent
谢谢 Rich,那对我来说可行。虽然并不像我希望的那么简单 :) - David
我尝试了上述解决方案,它部分地起作用。当我尝试执行mvn install时,它会复制资源,但最后还会尝试将它们部署到存储库,并在此期间查找子模块的src/main/resource中的资源,导致出现以下异常。 - user373201
安装构件时出错:文件/media/.../certificates/src/main/resources/filters/mr.filter.properties不存在。 - user373201
这是我采用的方法,尽管我遇到了小问题。这个答案建议将.properties文件附加到您的父POM并在那里配置maven-dependency-plugin。但问题是,当父POM正在构建时,它将寻找尚未安装的.properties工件。解决方法是在子模块中配置maven-dependency-plugin。这很不幸,因为该配置将被复制。 - Joe Snikeris

4

我不知道这是否是一种选择,但是,你可以在pom.xml的属性部分中定义属性,而不是在外部文件中定义它们,这样你也可以达到同样的效果:

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

因此,在父POM中定义<properties>应该能够轻松过滤子模块。

0
您也可以在父级 pom.xml 中使用筛选器的绝对路径来共享筛选器。
由于路径取决于环境(Eclipse Windows / Eclipse Linux / BuildServer),因此您可以将路径前缀或其部分放入 settings.xml 文件的配置文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接