要求在子模块中定义Maven属性

时间:2013-02-07 12:57:11

标签: maven pom.xml maven-enforcer-plugin

我最近使用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>

2 个答案:

答案 0 :(得分: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>

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

建立公司POM

mvn -Dcorporate.build=true clean deploy

您想要跳过的其他内容也可以包含在该个人资料中。像魅力一样。

答案 1 :(得分:0)

requirePropertyDivergesextra-enforcer-rules规则允许您检查在父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>