单独发布maven附件

时间:2014-10-27 17:17:15

标签: maven maven-nar-plugin

我在多个平台(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

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

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

1 个答案:

答案 0 :(得分:1)

  

因为构建在不同的框上运行,所以发布步骤不可能一次性发生。

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

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

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

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循环中构建文件列表,然后使用{{1你上面给出的调用。

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