Maven enforcer在子对象中追加

Maven enforcer在子对象中追加,maven,maven-3,maven-enforcer-plugin,Maven,Maven 3,Maven Enforcer Plugin,我正在使用maven enforcer插件。假设我有一个父级和子级pom.xml,我希望排除和包含标记中的元素被追加而不是覆盖。我已经尝试过使用combine.children=“append”进行此操作,但最终我得到了一个额外的配置标记。我是否错误地使用了combine.children和/或如何避免额外的配置标记?请参见下面的示例: 在parentpom.xml中: <project> [...] <build> <plugins>

我正在使用maven enforcer插件。假设我有一个父级和子级
pom.xml
,我希望
排除
包含
标记中的元素被追加而不是覆盖。我已经尝试过使用
combine.children=“append”
进行此操作,但最终我得到了一个额外的
配置
标记。我是否错误地使用了
combine.children
和/或如何避免额外的
配置
标记?请参见下面的示例:

在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>
<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>
预期有效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>
<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>

[...]
org.apache.maven.plugins
maven enforcer插件
1.4.1
强制执行禁止的依赖项
执行
org.apache.maven
maven:badArtifact
*:坏神器
maven:badArtifact:1.0
maven:otherArtifact:2.0
真的
[...]
实际有效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>
<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>

[...]
org.apache.maven.plugins
maven enforcer插件
1.4.1
强制执行禁止的依赖项
执行
org.apache.maven
maven:badArtifact
*:坏神器

如果您确实希望获得预期的合并配置,则应在子模块中包含以下内容:

<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>
<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元素的内容是一个复杂的结构而不是文本,那么它的子元素仍将遵循默认的合并策略,除非它们本身用属性标记


那是意料之中的事。父POM使用执行
元素,而子POM使用全局配置(不在任何执行下)。事实上,我认为您的
combine.children=“append”
在这里没有效果。您没有覆盖相同的配置元素。如果我不使用append,有效的pom将只包含
org.apache.maven:otherArtifact:2.0
。因此,它确实有影响。