2017-09-08 49 views
3

我想要構建一個Maven原型,檢查提供的artifactId和groupId是否匹配給定的正則表達式。這樣,我想強制執行我們組織的命名約定,例如ear文件的名稱以-app結尾,所有groupIds以de.companyname開頭。Maven原型:驗證artifactId或groupId

這可能嗎?

我發現,您可以檢查對一個正則表達式requiredProperty

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

但是當我通過Eclipse構建原型給定值被忽略,這可能是由於舊版本的maven-的在eclipse中使用的archetype-plugin(這不適用於「build-in」屬性,如groupId或artifactId)。

+0

http://www.eclipse.org/m2e/documentation/release-notes-17.html顯示,M2E仍然使用Maven的原型 - 插件2.4,所以對requiredProperties沒有正則表達式驗證。這部分解決了。 –

回答

2

此:

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

... 定義所需的屬性(使用默認值和驗證)的方式。但是,IIRC是在原型插件的v3.0.0中引入的,因此您可能使用的是以前的版本。

編輯1:在回答這個問題時,「validationRegex可以應用於artifactId和groupId」。是的,它可以。它可以應用於requiredProperties中的任何條目,但有以下注意事項:validationRegex僅適用於在命令行中提供的輸入,因此通過命令行參數(-DgroupId=...,-DartifactId=...)提供defaultValue或定義值旁邊的步驟驗證。下面是一個具體的例子,考慮以下requiredPropertiesarchetype-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像這樣:

定義屬性「用戶名」的值(應與表達式'^ [az] * $')匹配:無論

值與表達式不匹配,請重試:無論如何

定義值屬性...

到目前爲止好(在某種程度上)。

但是,以下命令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> 
+0

謝謝,但可以將validationRegex應用於artifactId和groupId嗎? –

+0

是的,只要這些參數值是交互式提供的。我已經更新了答案,以說明這一點。 – glytching