如何按目录结构仅下载指定Maven制品并上传至JFrog Artifactory
问题描述
我需要把标准Maven仓库里的指定制品复制到JFrog Artifactory,流程是先从Maven仓库下载制品,再上传到Artifactory。之前用JFrog CLI可以在两个Artifactory之间复制,但这个工具没法处理非Artifactory的Maven仓库。
试过用以下脚本通过mvn dependency:get下载:
# 创建临时目录 tmp=$(mktemp -d) # 要下载的制品 artifact="org.postgresql:postgresql:42.3.9" # 下载制品 mvn dependency:get \ -Dmaven.repo.local="$tmp" \ -Dartifact="$artifact" \ -Dtransitive=false \ --settings ~/.m2/settings_empty.xml
其中settings_empty.xml内容为:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" > </settings>
但这个命令会下载大量无关文件,临时目录里有很多额外内容。如果用mvn dependency:copy命令:
mvn dependency:copy \ -DoutputDirectory="$tmp" \ -Dartifact="$artifact" \ -DexcludeTransitive=true \ --settings ~/.m2/settings_empty.xml
只能复制jar文件,缺少对应的pom和sha1校验文件。
请问能不能只下载目标制品?以org.postgresql:postgresql:42.3.9为例,期望的目录结构是:
tmp.o4rZ5c4yZ8 $ tree . └── org └── postgresql └── postgresql └── 42.3.9 ├── postgresql-42.3.9.jar ├── postgresql-42.3.9.jar.sha1 ├── postgresql-42.3.9.pom └── postgresql-42.3.9.pom.sha1 5 directories, 4 files
解决方案
方法1:优化mvn dependency:get命令,精准控制下载
dependency:get默认会下载Maven运行所需的插件依赖,这是出现大量无关文件的原因。添加参数跳过插件依赖,同时明确指定中央仓库,即可仅获取目标制品:
# 创建临时目录 tmp=$(mktemp -d) # 要下载的制品 artifact="org.postgresql:postgresql:42.3.9" # 仅下载目标制品,无额外插件依赖 mvn dependency:get \ -Dmaven.repo.local="$tmp" \ -Dartifact="$artifact" \ -Dtransitive=false \ -Dplugin.dependency.skip=true \ -DremoteRepositories="central::default::https://repo1.maven.org/maven2" \ --settings ~/.m2/settings_empty.xml
执行后,临时目录会生成标准Maven结构,包含jar、pom及对应的sha1校验文件,无多余内容。
方法2:用mvn dependency:copy同时获取jar和pom
如果偏好dependency:copy,可以指定下载类型为jar和pom,再自动整理目录结构:
tmp=$(mktemp -d) artifact="org.postgresql:postgresql:42.3.9" # 同时下载jar和pom到临时子目录 mvn dependency:copy \ -DoutputDirectory="$tmp/temp_files" \ -Dartifact="$artifact:jar,pom" \ -DexcludeTransitive=true \ -DremoteRepositories="central::default::https://repo1.maven.org/maven2" \ --settings ~/.m2/settings_empty.xml # 解析制品信息,构建标准目录结构 group_path=$(echo $artifact | cut -d: -f1 | tr '.' '/') artifact_id=$(echo $artifact | cut -d: -f2) version=$(echo $artifact | cut -d: -f3) target_dir="$tmp/$group_path/$artifact_id/$version" mkdir -p "$target_dir" # 移动文件到目标目录 mv "$tmp/temp_files"/* "$target_dir/" # 生成sha1校验文件(若Maven未自动生成) cd "$target_dir" for file in *.jar *.pom; do sha1sum "$file" | cut -d' ' -f1 > "$file.sha1" done # 清理临时子目录 rm -rf "$tmp/temp_files"
方法3:直接用curl下载(轻量化方案)
不依赖Maven,直接从中央仓库获取所需文件,手动构建目录结构:
tmp=$(mktemp -d) group="org.postgresql" artifact_id="postgresql" version="42.3.9" base_url="https://repo1.maven.org/maven2/$(echo $group | tr '.' '/')/$artifact_id/$version" # 创建目标目录 target_dir="$tmp/$(echo $group | tr '.' '/')/$artifact_id/$version" mkdir -p "$target_dir" # 下载所有需要的文件 cd "$target_dir" curl -O "$base_url/$artifact_id-$version.jar" curl -O "$base_url/$artifact_id-$version.jar.sha1" curl -O "$base_url/$artifact_id-$version.pom" curl -O "$base_url/$artifact_id-$version.pom.sha1"
内容的提问来源于stack exchange,提问作者Eastman
相关产品推荐
相关产品推荐

