我在多个平台(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
因为它认为它需要主要工件。
如何指定我追加到出版物,而不是创建一个全新的出版物?
答案 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。