2013-12-09 110 views
2

因此,我有這個問題,我想禁止用戶在他們的pom.xml中擁有本地存儲庫。我可以用執行插件來做,但同時沒有任何東西阻止某人刪除插件並在沒有插件的情況下運行項目。如果有一種方法將這些強制執行置於settings.xml中,或者可能以某種方式擴展maven,那將非常酷。Maven在pom.xml上強制執行一些規則

總的想法是,我希望用戶仍然運行相同的「乾淨安裝」,並且如果在pom.xml中配置了本地存儲庫,則該項目應該失敗。

這甚至有可能與maven?

編輯 爲了保持它的簡單:當我運行「命令mvn全新安裝」針對其內部具有配置的倉庫一個POM,構建必須失敗。請注意,我不想使用某種插件來實現此目的,除非它可以使用settings.xml進行配置。 我爲什麼要這樣?因爲它在我們的情況下弄亂了自動構建,所以外部存儲庫必須在settings.xml中配置,而不是在每個pom中的本地配置。

+0

什麼用戶和什麼POM?請詳細瞭解您的使用案例。 – chrylis

+0

因此,如果假設的用戶將要使用POM來解決問題,那麼使用settings.xml來阻止他們與其混淆? –

+0

@TomG部署機器(運行代碼的地方)完全在我的控制之下,構建會自動推送到這些機器,而無需用戶交互。沒辦法有人可以在那裏編輯setting.xml。 – Eugene

回答

0

我最終在jar文件maven-model-builder-3.0.5.jar中編輯了Maven Super Pom。我添加了沒有存儲庫規則的執行插件。似乎工作正常。 所有與一個簡單的腳本。這裏是腳本 - 可能會做得更好(我遠遠不是一個腳本大師:)):

#!/bin/sh 
#couple of safety checks 
if [ "$#" -ne 1 ]; then 
    echo "usage: ./maven-enforcer.sh <path_to_the_maven_install_lib_folder>" 
    echo "1 argument required, $# provided" 
    exit 1 
fi 

if [ ! -d $1 ]; then 
    echo "directory '$1' does not exist, exiting..." 
    exit 1 
fi 

if [ ! -e $1/maven-model-builder-3.0.5.jar ]; then 
     echo "file 'maven-model-builder-3.0.5.jar' does not exist in directory $1, exiting..." 
     exit 1 
fi 

#back-up the already existing jar 
cp $1/maven-model-builder-3.0.5.jar $1/maven-model-builder-3.0.5_backup.jar 

cd $1 

#unpack the contents of the jar 
jar xf $1/maven-model-builder-3.0.5.jar 

cd org/apache/maven/model/ 

#test if the command did not run already 
didItRunAlready=`grep -n "maven-enforcer-plugin" pom-4.0.0.xml | cut -f1 -d:` 

if [[ ! -z "$didItRunAlready" ]]; then 
    echo "Command already run once, exiting..." 
    exit 1 
fi 

lineNumber=`grep -n "</pluginManagement>" pom-4.0.0.xml | cut -f1 -d:` 

textToAdd="<plugins>\n<plugin>\n<groupId>org.apache.maven.plugins</groupId>\n<artifactId>maven-enforcer-plugin</artifactId>\n<version>1.3.1</version>\n<executions>\n<execution>\n<id>enforce-no-repositories</id>\n<goals>\n<goal>enforce</goal>\n</goals>\n<configuration>\n<rules>\n<requireNoRepositories>\n<message>Best Practice is to never define repositories in pom.xml (use a repository manager instead)</message>\n</requireNoRepositories>\n</rules>\n</configuration>\n</execution>\n</executions>\n</plugin></plugins>" 

sed ""$lineNumber"a $textToAdd" pom-4.0.0.xml > result.xml 
rm pom-4.0.0.xml 
mv result.xml pom-4.0.0.xml 

cd ../../../../ 

jar vfu maven-model-builder-3.0.5.jar org/ 

rm -fr META-INF 
rm -fr org 

echo "Succesfully updated maven-model-builder-3.0.5.jar" 
0

創建新的pom模塊,該模塊將執行ant任務以根據所需的x路徑驗證目標pom.xml。