Maven Archetype:验证 artifactId 或 groupId

Posted

技术标签:

【中文标题】Maven Archetype:验证 artifactId 或 groupId【英文标题】:Maven Archetype: Validate artifactId or groupId 【发布时间】:2018-02-17 10:22:44 【问题描述】:

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

这可能吗?

我发现您可以检查 requiredProperty 的正则表达式

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

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

【问题讨论】:

eclipse.org/m2e/documentation/release-notes-17.html 表明 m2e 仍然使用 maven-archetype-plugin 2.4,因此不需要对 requiredProperties 进行正则表达式验证。那部分已经解决了。 【参考方案1】:

这个:

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

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

编辑 1:针对这个问题“可以将validationRegex 应用于artifactId 和groupId”。是的,它可以。它可以应用于requiredProperties 中的任何条目,但需要注意的是:validationRegex 仅适用于命令行提供的输入,因此提供defaultValue 或通过命令行参数定义值(-DgroupId=...、@ 987654327@ ) 侧步骤验证。这是一个具体的例子,在archetype-descriptor.xml 中给出以下requiredProperties

<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]*$”):随便

值与表达式不匹配,请重试:whatever

定义属性值...

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

但是下面的命令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>

【讨论】:

谢谢,validationRegex 可以应用于 artifactId 和 groupId 吗? 可以,只要以交互方式提供这些参数值。我已经更新了答案以明确这一点。 对于 groupId 这使用点: .

以上是关于Maven Archetype:验证 artifactId 或 groupId的主要内容,如果未能解决你的问题,请参考以下文章

自定义Maven Archetype之 maven-archetype-archetype

怎么看maven工程的 archetype

Maven的Archetype简介

使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype

使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype

Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quick