Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven enforcer append in children

I am using the maven enforcer plugin. Given I have a parent and child pom.xml, I would like that the elements in the exclusions and inclusions tags are appended rather than overridden. I have tried using combine.children="append" for this and it works but I am ending up with an extra configuration tag. Am I using combine.children incorrectly and/or how can I avoid the extra configuration tag? See the example below:

In parent pom.xml:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce-banned-dependencies</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <bannedDependencies>
                  <excludes>
                    <exclude>org.apache.maven</exclude>
                    <exclude>org.apache.maven:badArtifact</exclude>
                    <exclude>*:badArtifact</exclude>
                  </excludes>
                  <includes>
                    <!--only 1.0 of badArtifact is allowed-->
                    <include>org.apache.maven:badArtifact:1.0</include>
                  </includes>
                </bannedDependencies>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

In child pom.xml:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <configuration>
          <rules>
            <bannedDependencies>
              <includes combine.children="append">
                <include>org.apache.maven:otherArtifact:2.0</include>
              </includes>
            </bannedDependencies>
          </rules>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Expected effective POM:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce-banned-dependencies</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <bannedDependencies>
                  <excludes>
                    <exclude>org.apache.maven</exclude>
                    <exclude>org.apache.maven:badArtifact</exclude>
                    <exclude>*:badArtifact</exclude>
                  </excludes>
                  <includes>
                    <!--only 1.0 of badArtifact is allowed-->
                    <include>org.apache.maven:badArtifact:1.0</include>
                    <include>org.apache.maven:otherArtifact:2.0</include>
                  </includes>
                </bannedDependencies>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Actual effective POM:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce-banned-dependencies</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <bannedDependencies>
                  <excludes>
                    <exclude>org.apache.maven</exclude>
                    <exclude>org.apache.maven:badArtifact</exclude>
                    <exclude>*:badArtifact</exclude>
                  </excludes>
                  <includes combine.children="append>
                    <!--only 1.0 of badArtifact is allowed-->
                    <include>org.apache.maven:badArtifact:1.0</include>
                    <include>org.apache.maven:otherArtifact:2.0</include>
                  </includes>
                </bannedDependencies>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <rules>
            <bannedDependencies>
              <includes combine.children="append">
                <include>org.apache.maven:otherArtifact:2.0</include>
              </includes>
            </bannedDependencies>
          </rules>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
like image 766
ET13 Avatar asked Jun 17 '16 11:06

ET13


1 Answers

If you really want to get the expected merged configuration you should then have in your child module the following:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <executions>
        <execution>
            <id>enforce-banned-dependencies</id>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <includes>
                            <include>org.apache.maven:badArtifact:2.0</include>
                        </includes>
                    </bannedDependencies>
                </rules>
                <fail>true</fail>
            </configuration>
        </execution>
    </executions>
</plugin>

That is, reusing the same execution id value in order to point (override/merge) the same execution with additional configuration.

Then the merged effective pom will be as following:

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
        <execution>
            <id>enforce-banned-dependencies</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <includes combine.children="append">
                            <include>org.apache.maven:badArtifact:1.0</include>
                            <include>org.apache.maven:badArtifact:2.0</include>
                        </includes>
                        <excludes>
                            <exclude>org.apache.maven</exclude>
                            <exclude>org.apache.maven:badArtifact</exclude>
                            <exclude>*:badArtifact</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
                <fail>true</fail>
            </configuration>
        </execution>
    </executions>
</plugin>

Hence, no need to use it: the default merging behavior will suit your needs.


One important note about the usage of combine.* attributes, from official documentation

Note that these attributes only apply to the configuration element they are declared on, and are not propagated to nested elements. That is if the content of an item element from the child POM was a complex structure instead of text, its sub-elements would still be subject to the default merge strategy unless they were themselves marked with attributes.

like image 74
A_Di-Matteo Avatar answered Nov 02 '22 01:11

A_Di-Matteo