背景
公司代码是在内网开发,之前使用的maven离线仓库分散在不同的开发机器上,版本难以维护。后采用sonatype OSS 做maven nexus,搭建内网私服。
采坑过程
经验之谈
由于在内网开发,不便于直接联网下载,需要将原maven离线仓库中jar/pom上传至nexus。
- 上传jar文件
mvn deploy:deploy-file -Dfile=<file> -DrepositoryId=<repositoryId> -Durl=<url> -DpomFile=<pomFile> -Dpackaging=jar
# 此处-Dfile=<file> 为jar文件
此处需要额外注意 -DpomFile=<pomFile> ,如果不指定则需要手动指定groupId、artifactId、version,生成的pom文件中也只包含指定内容,极大可能造成dependencies、parent等关系丢失。
- 上传pom文件
mvn deploy:deploy-file -Dfile=<file> -DrepositoryId=<repositoryId> -Durl=<url> -DpomFile=<pomFile> -Dpackaging=pom
# 此处-Dfile=<file> 为pom文件
问题排查
Cannot deploy artifact from the local repository:/path/to/your/loca/repository/jar
如果mvn deploy的jar文件已经在本地maven库中,可能会报告上述错误,将对应上传的jar/pom文件复制到临时目录中,以临时目录中的文件执行即可。
脚本
附上shell脚本,方便批量处理
#!/bin/bash
pom_path=$1
# 设置mvn执行时占用的内存大小,内存充足不设定也没问题
export MAVEN_OPTS="-Xms32M -Xmx32M"
# 改为自己的maven nexus地址
NEXUS_URL="xxxxxxx"
REPOSITORY_ID="your nexus repository id"
POMS="poms.txt"
find $pom_path -name "*.pom" | sort > $POMS || exit 1
for pom in `cat $POMS`
do
# 复制pom文件到当前目录
\cp $pom .
pom_file_name=$(echo "$pom" | awk -F "/" '{print $NF}')
# 将pom文件后缀换成.jar找到对应的jar文件(此处根据约定pom/jar文件只是后缀不同来进行推测)
jar=${pom%".pom"}".jar"
# 如果jar文件存在,则将其复制到当前目录
if [ -f $jar ]; then
\cp $jar .
jar_file_name=$(echo "$jar" | awk -F "/" '{print $NF}')
# 部署jar文件,附带自身提供的pom文件
mvn deploy:deploy-file -Dfile=$jar_file_name -Durl=$NEXUS_URL -DrepositoryId=$REPOSITORY_ID -DpomFile=$pom_file_name -Dpackaging=jar
else
# 只部署pom文件
mvn deploy:deploy-file -Dfile=$pom_file_name -Durl=$NEXUS_URL -DrepositoryId=$REPOSITORY_ID -DpomFile=$pom_file_name -Dpackaging=pom
fi
# 清理复制的临时jar和pom文件
\rm -rf ./$pom_file_name ./$jar_file_name
done
# 清理POM列表文件
\rm -rf $POMS
参考
感谢这篇帖子给的启发,遇到问题先去官网查文档。
https://blog.csdn.net/andyzhaojianhui/article/details/82785934