You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按目录结构仅下载指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:19:51