在每个Build

时间:2016-11-25 14:34:14

标签: java maven netbeans

我有一个问题,我自己无法回答。

简介: 我们已经开发了一个企业pom,它对项目实施了一些规则,提供了一些公司范围的配置文件,分发管理等。

我们的大多数开发人员使用公司pom,但不是每个人都这样做,而且并非所有开发人员都在下一个开发周期内迁移旧项目。

所以我决定编写一个maven插件,它只是检查是否有人在开发阶段(而不是qs / prod)构建项目以及用户是否使用我们的企业pom。

问题: 我希望强制插件在每个“mvn clean install”或类似的上执行,而不用在项目pom中配置插件。 我的第一个猜测是settings.xml,但不幸的是你无法通过settings.xml执行插件。

有人有解决方案吗?

简短问题:强制在每个构建上执行插件,而不在项目pom和/或命令行中提供插件!

2 个答案:

答案 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

请注意,此脚本只是一个示例!它不适用于多模块项目,而且编码不好。但作为解决方案方法,这就足够了。