我有一个问题,我自己无法回答。
简介: 我们已经开发了一个企业pom,它对项目实施了一些规则,提供了一些公司范围的配置文件,分发管理等。
我们的大多数开发人员使用公司pom,但不是每个人都这样做,而且并非所有开发人员都在下一个开发周期内迁移旧项目。
所以我决定编写一个maven插件,它只是检查是否有人在开发阶段(而不是qs / prod)构建项目以及用户是否使用我们的企业pom。
问题: 我希望强制插件在每个“mvn clean install”或类似的上执行,而不用在项目pom中配置插件。 我的第一个猜测是settings.xml,但不幸的是你无法通过settings.xml执行插件。
有人有解决方案吗?
简短问题:强制在每个构建上执行插件,而不在项目pom和/或命令行中提供插件!
答案 0 :(得分:1)
一般情况下,您无法控制开发人员的系统,因此尝试使用Maven发行版的settings.xml解决此问题并非如此。您必须查找每个项目使用的放置。一个系统可能是SCM,但在那里添加钩子可能很难。 假设您有一个工件库管理器,那就是进行这些检查的地方。我知道Nexus和Artifactory都可以验证上传的文件,并且在分析pom.xml时特别强大 因此,您的重点不应该是尝试使用maven插件来解决这个问题,而应该在下一个常见的地方解决这个问题。
答案 1 :(得分:0)
正如Robert所说,在基础设施上验证这种类型可能更好,而不是在开发者机器上验证。
git中的预接收挂钩可以解决问题。
#!/bin/bash
#
# Hook simply validates whether the corporate pom is used
# and rejects the commit when the corporate pom is absent
echo "### Validate commit against Company rules... ####"
corppom_artefactId='corporate-pom'
oldrev=$1
newrev=$2
refname=$3
while read oldrev newrev refname; do
pom=`git ls-tree --full-name -r ${newrev} | grep pom.xml | awk '{ print $3 }'`
# Project seems not to be a maven project. So it's okay that the corporate pom is missing
if [ -z ${pom} ];
then
continue;
else
git cat-file blob ${pom} | grep $corppom_artefactId >> /dev/null
if [[ $? -ne 0 ]];
then
echo "### NO CORPORATE POM... Bye Bye ###"
# Rejecting commit
exit 1;
else
echo "### CORPORATE POM IS USED. GREAT! ###"
fi
fi
done
请注意,此脚本只是一个示例!它不适用于多模块项目,而且编码不好。但作为解决方案方法,这就足够了。