Maven执法者附加在儿童身上

时间:2016-06-17 11:39:09

标签: maven maven-3 maven-enforcer-plugin

我正在使用maven enforcer插件。鉴于我有父母和子女pom.xml,我希望exclusionsinclusions标记中的元素被追加而不是被覆盖。我已尝试使用combine.children="append"来实现此功能,但它最终会增加configuration个标记。我是否错误地使用了combine.children和/或如何避免额外的configuration代码?请参阅以下示例:

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

在孩子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>

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

实际有效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>

1 个答案:

答案 0 :(得分:2)

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

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

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

有关使用official documentation

combine.*属性的一个重要说明
  

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