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

时间:2009-10-06 21:40:07

标签: maven-2

我有一个多模块项目,我想定义一个将属性应用于所有子模块的过滤器文件。例如,我想有以下结构:


- filter.properties
- module1
- 资源1 - module2
- resource2

这样当我构建父级时,它会在构建子模块时将过滤器应用于resource1和resource2。

如果我创建上面的结构并在父POM中定义过滤器,则构建失败,因为它希望在每个子模块中定义过滤器......有一种简单的方法可以忽略我的方法吗?

3 个答案:

答案 0 :(得分:4)

This answer描述了如何扩展properties-maven-plugin以允许在项目之间共享属性文件。如果您使用该插件,则属性将可用于构建,因此可在过滤资源时使用。

或者,您可以在某些构建中将过滤器文件指定为附加工件,以便它在存储库中可用,然后使用依赖性插件下载过滤器文件,最后指定过滤器使用共享文件。 / p>

要将过滤器附加到您的父版本,请使用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 :(得分:4)

我不知道这是否是一个选项,但是,您可以在pom.xml的属性部分中定义它们,而不是在外部文件中定义属性,您将获得相同的效果:

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

因此,在父pom中定义<properties>应该允许您轻松过滤子模块。

答案 2 :(得分:0)

您还可以使用父pom.xml中过滤器的绝对路径来共享过滤器

由于路径依赖于环境(eclipse windows / eclipse linux / buildserver),您可以将路径前缀或其中的一部分放在settings.xml配置文件中