Question

I recently used the Maven Enforcer Plugin to mandate that all POMs define a foo.bar property. I placed this statement in my corporate POM and assumed it would then apply to my child projects.

To my dismay (but not surprise), the rule was also enforced on my corporate POM. As a result, I dutifully defined a placeholder foo.bar property and thought I was done.

Unfortunately, all the child projects inherit this property and thereby pass the enforcer test. I'm left unable to determine whether the children have explicitly defined this property or simply inherited a nonsense value. Can anyone suggest a way to either:

  • ensure this (particular) rule is not applied to my coporate POM; or

  • ensure my placeholder property is not inherited by the child projects; or

  • solve my problem another way?

In case it helps, the definition of my enforcer rules is shown below. This snippet is from my corporate POM.

<!-- Enforce good behaviour in child POMs -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-enforcer-plugin</artifactId>
  <version>1.2</version>
  <executions>
    <execution>
      <id>enforce-good-behaviour</id>
      <goals>
        <goal>enforce</goal>
      </goals>
      <configuration>
        <rules>
          <requireProperty>
            <property>foo.bar</property>
            <message>NAUGHTY!</message>
            <regex>.+</regex>
            <regexMessage>The property must contain at least one character.</regexMessage>
          </requireProperty>
        </rules>
      </configuration>
    </execution>
  </executions>
</plugin>

My goal was to automatically use this property value as part of an SCM tagging instruction. I have the following snippet in my corporate POM that defines a nice tagging scheme for my child projects:

<!-- Ensure we use a consistent tagging scheme for releases -->
<plugin>
  <artifactId>maven-release-plugin</artifactId>
  <configuration>
    <tagNameFormat>a.b.c.${foo.bar}</tagNameFormat>
    <useReleaseProfile>false</useReleaseProfile>
  </configuration>
</plugin>
Était-ce utile?

La solution

I had this exact same dilemma. Here's how I solved it.

In the corporate POM, I added a profile like this:

    <profile>
    <!-- When we are building the corporate base projects we don't want 
         to require that all of the properties that should be provided by 
         child projects (inheriters) are defined. So we activate this 
         profile when building the corporate projects to bypass anything 
         that only applies to children (the leaf projects). 
         Add "-Dcorporate.build=true" on the maven cmd line when building
         and releasing the corporate POMs to accomplish this. -->
        <id>corporate-pom-build</id>
        <activation>
            <property>
                <name>corporate.build</name>
                <value>true</value>
            </property>
        </activation>
        <properties>
            <enforcer.skip>true</enforcer.skip>
            <remoteresources.skip>true</remoteresources.skip>
            <assembly.skipAssembly>true</assembly.skipAssembly>
        </properties>
    </profile>

Then, as the comment says, I build the corporate POMs with

mvn -Dcorporate.build=true clean deploy

Other things you want to skip could go in that profile as well. Works like a charm.

Autres conseils

The requirePropertyDiverges rule of the extra-enforcer-rules lets you check that a property that is defined in your parent POM is overridden in the child POM.

For your use case the configuration should be something like this (haven't tested it):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-enforcer-plugin</artifactId>
  <version>1.2</version>
  <executions>
    <execution>
      <id>enforce-property-overridden-in-child</id>
      <goals>
        <goal>enforce</goal>
      </goals>
      <configuration>
        <rules>
          <requirePropertyDiverges>
            <property>foo.bar</property>
          </requirePropertyDiverges>
        </rules>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>extra-enforcer-rules</artifactId>
      <version>1.0-alpha-5</version>
    </dependency>
  </dependencies>
</plugin>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top