【问题标题】:separately publish maven attachments单独发布maven附件
【发布时间】:2014-10-27 17:17:14
【问题描述】:

我正在多个平台(Mac 和 Windows)上构建 NAR。构建很复杂,无法通过 Maven NAR 插件完成,但我自己构建 nar 文件并使用mvn 命令行工具进行部署。

典型的部署方式是一次性完成,例如

mvn deploy:deploy-file \
    -Dfile=foobar.jar \
    -Dpackaging=jar \
    -Dfiles=foobar-x86_64-MacOSX-gcc-shared.nar,foobar-x86_64-Windows-MSVC-shared.nar \
    -Dclassifiers=x86_64-MacOSX-gcc-shared,x86_64-Windows-MSVC-shared \
    -Dtypes=nar,nar \
    -DgroupId=com.example \
    -DartifactId=foobar \
    -Dversion=1.0.0-SNAPSHOT \
    -Durl=$URL \
    -DrepositoryId=nexus 

但是,由于构建是在不同的机器上运行的,因此发布步骤不能一次性完成。理想情况下,我希望能够在构建完成时将附件“附加”到主要工件。即,

运行一次:

mvn deploy:deploy-file \
    -Dfile=foobar.jar \
    -Dpackaging=jar \
    -DgroupId=com.example \
    -DartifactId=foobar \
    -Dversion=1.0.0-SNAPSHOT \
    -Durl=$URL \
    -DrepositoryId=nexus 

然后在 Mac 上构建从站:

mvn deploy:deploy-file \
    -Dfiles=foobar-x86_64-MacOSX-gcc-shared.nar \
    -Dclassifiers=x86_64-MacOSX-gcc-shared \
    -Dtypes=nar \
    -DgroupId=com.example \
    -DartifactId=foobar \
    -Dversion=1.0.0-SNAPSHOT \
    -Durl=$URL \
    -DrepositoryId=nexus 

然后在 Windows 上构建从站:

mvn deploy:deploy-file \
    -Dfiles=foobar-x86_64-Windows-MSVC-shared.nar \
    -Dclassifiers=x86_64-Windows-MSVC-shared \
    -Dtypes=nar \
    -DgroupId=com.example \
    -DartifactId=foobar \
    -Dversion=1.0.0-SNAPSHOT \
    -Durl=$URL \
    -DrepositoryId=nexus 

当然,第一个命令运行良好。但是两个构建从属命令失败了

The parameters 'file' for goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file are missing or invalid

因为它认为它需要主要工件。

我如何指定我是追加到出版物,而不是创建一个全新的?

【问题讨论】:

    标签: maven maven-nar-plugin


    【解决方案1】:

    因为构建是在不同的盒子上运行的,所以发布步骤不能一次性完成。

    如果您使用像 Jenkins 这样的 CI 服务器来执行构建,您可以从每个从属节点发布工件,然后通过主节点上的下游作业访问它们。

    这就是我们在ImageJ 项目中解决问题的方法:我们让our Jenkins 聚合所有构建工件,然后一次性部署它们。首先,ImageJ-launcher 作业 - 一个多配置项目 - 使用适当的从属构建代码,归档相关工件(将它们传输到主节点的文件系统)。然后ImageJ-launcher-deploy 作业将存档的工件从每个配置复制到一个目录中,以便一次性部署。

    如果有帮助,这里是 ImageJ-launcher-deploy shell 脚本的一部分,负责将 NAR 工件复制到一个地方:

    masterDir=workspace/label/master/target &&
    axesDirs=configurations/axis-label/*/builds/$buildNumber/archive/target &&
    : copy the nar/**/* files from all axes to master &&
    for path in $axesDirs/nar/*/bin/*/*
    do
            file=${path#$axesDirs/} &&
            if test -f $masterDir/$file
            then
                    # we ignore everything except Linux in the master
                    case "$path" in
                    */master/*Linux*)
                            ;;
                    */master/*)
                            continue
                            ;;
                    esac
    
                    cmp $path $masterDir/$file && continue
                    printf 'Artifacts disagree:\n%s\n%s\n\n' $path $masterDir/$file
                    errors=$(($errors+1))
            else
                    target=$masterDir/$file &&
                    mkdir -p ${target%/*} &&
                    cp $path $target
            fi
    done
    

    如果-Dfiles 支持不同目录中的文件列表,您甚至可能不需要复制工件 - 只需在 for 循环中构建文件列表,然后完成上面给出的 mvn deploy:deploy-file 调用.

    有关 ImageJ-launcher Jenkins 配置的更多详细信息,另请参阅 this answer

    【讨论】:

    • Maven 不允许附加工件太糟糕了。 :( 但考虑到限制,这种方法是最好的方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2019-10-29
    • 2013-04-02
    • 2014-09-12
    相关资源
    最近更新 更多