5

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

1 回答 1

4

如果您真的想获得预期的合并配置,那么您应该在子模块中具有以下内容:

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

也就是说,重用相同的执行id值以使用附加配置指向(覆盖/合并)相同的执行。

那么合并后的有效pom如下:

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

因此,无需使用它:默认的合并行为将满足您的需求。


关于combine.*属性使用的一个重要说明,来自官方文档

请注意,这些属性仅适用于声明它们的配置元素,不会传播到嵌套元素。也就是说,如果来自子 POM 的 item 元素的内容是复杂结构而不是文本,则它的子元素仍将服从默认的合并策略,除非它们本身带有属性标记。

于 2016-06-17T14:40:13.283 回答