我想构建一个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>