【问题标题】:Execute Maven Plugin in every Build在每个构建中执行 Maven 插件
【发布时间】:2016-11-25 14:34:13
【问题描述】:

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

简介: 我们开发了一个公司 pom,它对项目执行一些规则,提供一些公司范围的资料、分发管理等。

我们的大多数开发人员都使用企业 pom,但并非所有人都使用,而且并非所有人都在下一个开发周期内迁移旧项目。

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

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

有人有解决办法吗?

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

【问题讨论】:

标签: java maven netbeans


【解决方案1】:

通常你不控制开发者的系统,所以试图用 Maven 发行版的 settings.xml 来解决这个问题是不可行的。您必须寻找每个项目使用的放置。一个系统可能是 SCM,但在那里添加钩子可能很难。 假设您有一个工件存储库管理器,那就是进行此类检查的地方。我知道 Nexus 和 Artifactory 都可以验证上传的文件,并且在分析 pom.xml 方面特别强大 所以你的重点不应该放在尝试用 maven 插件解决这个问题上,而应该放在 infra 中的一个常见位置上。

【讨论】:

  • 是的,你是对的。通常你不能控制开发者系统,但是我们有多个 debian 包安装在每个工作站上,所以我们可以以某种方式控制开发者机器。我还考虑使用服务器端 git pre-recive 挂钩来解决这个问题。也许我试一试。
【解决方案2】:

正如罗伯特所说,在基础设施上验证这种类型可能会更好,而不是在开发人员机器上。

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

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

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2011-12-23
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2016-02-20
    相关资源
    最近更新 更多