Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
579 views
in Technique[技术] by (71.8m points)

maven 2 - How to share a filter file among Maven2 modules?

I have a multi-module project and I would like to define a single filter file that will apply properties to all the child modules. For example, I would like to have the following structure:

parent
- filter.properties
- module1
    - resource1
- module2
   - resource2

such that when I build parent, it would apply the filter to resource1 and resource2 when the child modules are built.

If I create the structure above and define the filter in the parent's POM, the build fails because it expects the filter to be defined in each child module... Is there a simple way to do this that I'm overlooking?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This answer describes how to extend the properties-maven-plugin to allow properties files to be shared between projects. If you use that plugin the properties would be made available to the build, and therefore can be used when filtering the resources.

Alternatively, you can specify a filter file as an attached artifact on some build, so that it is available in the repository, then use the dependency plugin to download the filter file, finally specify that the filter use the shared file.

To attach the filter to your parent build, use the build-helper-maven-plugin's attach goal:

  <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>

When the project hosting the filter is deployed, the filter will now be attached alongside it.

To download the filter file into your project, use the maven-dependency-plugin's copy-dependencies goal to download the file:

  <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>

If the dependency plugin configuration is defined in your parent project, all other projects can inherit the configuration and won't need to redefine it.

Then to use the downloaded filter:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...