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

这可能吗?

我发现您可以针对正则表达式检查requiredProperty
https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html

但是当我通过eclipse构建原型时,给定的值将被忽略,这可能是由于eclipse中使用了旧版本的maven-archetype-plugin(而且不适用于诸如groupId或artifactId)。

最佳答案

这个:

  <requiredProperties>
    <requiredProperty key=.. >
      <defaultValue/>
      <validationRegex/>
    </requiredProperty>
  </requiredProperties>
... 定义必需属性(带有默认值和验证)的方式。但是,IIRC是在原型插件的v3.0.0中引入的,因此也许您使用的是以前的版本。
编辑1 :针对此问题“validationRegex可以应用于artifactId和groupId”。是的,它可以。可以将其应用于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,如下所示:

定义属性“用户名”的值(应匹配表达式“^ [a-z] * $”):随便
值与表达式不匹配,请重试:任意
定义属性值...

到目前为止,一切都很好。
但是,以下命令mvn archetype:generate -DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=whatever将导致COM.XYZ.PQR用于groupId,即使它与validationRegex不符。
同样即使这些值不符合mvn archetype:generate -DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=WHATEVER,以下命令COM.XYZ.PQR也会导致WHATEVER用于groupId,validationRegex用于artifactId。
因此,总而言之: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>

07-27 22:58