3

我最近使用Maven Enforcer Plugin来强制所有 POM 定义一个foo.bar属性。我将此声明放在我的公司 POM 中,并假设它将适用于我的子项目。

令我沮丧的是(但并不意外),这条规则也在我的公司 POM 上强制执行。结果,我尽职尽责地定义了一个占位符foo.bar属性,并认为我已经完成了。

不幸的是,所有子项目都继承了这个属性,从而通过了强制测试。我无法确定孩子是明确定义了这个属性还是只是继承了一个无意义的值。任何人都可以提出一种方法:

  • 确保此(特定)规则不适用于我的公司 POM;或者

  • 确保我的占位符属性不被子项目继承;或者

  • 以另一种方式解决我的问题?

如果有帮助,我的实施者规则的定义如下所示。这个片段来自我公司的 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>

我的目标是自动将此属性值用作 SCM 标记指令的一部分。我的公司 POM 中有以下片段,它为我的子项目定义了一个很好的标记方案:

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

2 回答 2

3

我有同样的困境。这是我解决它的方法。

在公司 POM 中,我添加了这样的配置文件:

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

然后,正如评论所说,我用

mvn -Dcorporate.build=true clean deploy

您想跳过的其他内容也可以放在该配置文件中。奇迹般有效。

于 2013-02-07T14:44:57.500 回答
0

extra-enforcer-rulesrequirePropertyDiverges规则允许您检查在父 POM 中定义的属性是否在子 POM 中被覆盖。

对于您的用例,配置应该是这样的(尚未测试):

<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>
于 2013-06-25T10:59:40.093 回答