Maven Archetype:验证artifactId或groupId

时间:2017-09-08 13:13:39

标签: java maven maven-archetype

我想构建一个Maven原型,检查提供的artifactId和groupId是否与给定的正则表达式匹配。通过这种方式,我想强制执行我们组织的命名约定,例如名称以-app结尾的所有ear文件以及以de.companyname开头的所有groupIds。

这可能吗?

我发现你可以查看requiredProperty

的正则表达式

https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html

但是当我通过eclipse构建原型时,忽略了给定的值,这可能是由于eclipse中使用的旧版maven-archetype-plugin(这不适用于“内置”属性)比如groupId或artifactId)。

1 个答案:

答案 0 :(得分:3)

此:

  <requiredProperties>
    <requiredProperty key=.. >
      <defaultValue/>
      <validationRegex/>
    </requiredProperty>
  </requiredProperties>

... 定义必需属性的方式(使用默认值和验证)。但是,IIRC,它是在原型插件的v3.0.0中引入的,所以也许你使用的是先前的版本。

编辑1 :响应此问题&#34;可以将validationRegex应用于artifactId和groupId&#34;。是的,它可以。它可以应用于requiredProperties中的任何条目,但有一点需要注意:validationRegex仅适用于命令行提供的输入,因此提供defaultValue或通过命令行参数定义值(-DgroupId=...-DartifactId=...)边步验证。这是一个具体的例子,给出requiredProperties中的以下archetype-descriptor.xml

<requiredProperties>
  <requiredProperty key="artifactId">
    <validationRegex>^[a-z]*$</validationRegex>
  </requiredProperty>
  <requiredProperty key="groupId">
    <defaultValue>COM.XYZ.PQR</defaultValue>
    <validationRegex>^[a-z]*$</validationRegex>
  </requiredProperty>
</requiredProperties>

以下命令:mvn archetype:generate -DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DgroupId=com.foo.bar将导致com.foo.bar用于groupId,系统将提示用户提供如下所示的artifactId:

  

定义属性&#39;用户名&#39; (应该匹配表达式&#39; ^ [a-z] * $&#39;):无论

     

值与表达式不匹配,请再试一次:无论

     

定义属性值...

到目前为止一直很好(有点)。

但是,以下命令mvn archetype:generate -DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=whatever将导致COM.XYZ.PQR用于groupId,即使它不符合validationRegex

类似地;以下命令mvn archetype:generate -DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=WHATEVER将导致COM.XYZ.PQR用于groupId,WHATEVER用于artifactId,即使这些值不符合validationRegex

因此,总结一下:validationRegex适用于任何requiredProperty(无论是保留属性 - 例如artifactId - 还是定制属性),但它仅适用于提供的值交互式,因此通过命令行参数侧步验证设置默认值或提供值。

注意:即使您使用validationRegex,您可能还需要考虑使用Maven Enforcer插件requireProperty rule,因为您希望强制执行的项目属性可以在原型具有之后更改曾被用来创建项目。来自文档:

  

此规则可以强制设置声明的属性,并可选择根据正则表达式对其进行评估。

以下是一个例子:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
      <execution>
        <id>enforce-property</id>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <requireProperty>
              <property>project.artifactId</property>
              <message>"Project artifactId must match ...some naming convention..."</message>
              <regex>...naming convention regex...</regex>
              <regexMessage>"Project artifactId must ..."</regexMessage>
            </requireProperty>
          </rules>
          <fail>true</fail>
        </configuration>
      </execution>
    </executions>
  </plugin>