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

Maven无法将Delta Lake依赖下载至指定目录问题求助

离线获取Delta Lake全依赖Jar包的问题解决

出于安全限制,需要让Spark应用完全不依赖外网,因此计划通过Maven将Delta Lake及其所有依赖Jar包下载到指定目录,之后手动挂载到Spark环境中。尝试使用maven-dependency-plugin的get命令,但命令显示构建成功后,目标目录中无任何文件输出,且希望避免额外定义POM文件。

使用的命令

mvn org.apache.maven.plugins:maven-dependency-plugin:3.2.0:get \
-DremoteRepositories=https://repo.maven.apache.org/maven2/ \
-Dartifact=io.delta:delta-spark_2.13:3.1.0 \
-Ddest=~/_mvn_local

命令执行输出

data-lake % mvn org.apache.maven.plugins:maven-dependency-plugin:3.2.0:get \
    -DremoteRepositories=https://repo.maven.apache.org/maven2/ \
    -Dartifact=io.delta:delta-spark_2.13:3.1.0 \
    -Ddest=~/_build           

[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- dependency:3.2.0:get (default-cli) @ standalone-pom ---
[INFO] Resolving io.delta:delta-spark_2.13:jar:3.1.0 with transitive dependencies
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.548 s
[INFO] Finished at: 2024-03-01T14:37:59Z
[INFO] ------------------------------------------------------------------------

问题原因

dependency:get命令的核心作用是将指定构件下载到本地Maven仓库(默认路径~/.m2/repository),而非直接将所有依赖输出到-Ddest指定的目录:

  • -Ddest参数仅会将主Jar包复制到目标目录,但如果本地仓库已存在该构件,Maven会跳过复制操作,导致目标目录为空。
  • 即使添加-Dtransitive=true,也仅能确保依赖被下载到本地仓库,无法同步到指定目录。

解决方案

使用dependency:copy命令,可直接将主构件及其所有传递依赖复制到指定目录,无需编写POM文件:

mvn org.apache.maven.plugins:maven-dependency-plugin:3.2.0:copy \
-Dartifact=io.delta:delta-spark_2.13:3.1.0 \
-DremoteRepositories=https://repo.maven.apache.org/maven2/ \
-DoutputDirectory=~/your-target-directory \
-Dtransitive=true

参数说明

  • -Dtransitive=true:强制下载所有传递依赖
  • -DoutputDirectory:指定所有Jar包的输出目录(替换为你的目标路径)
  • -Dartifact:指定Delta Lake构件坐标

可选优化(排除Spark自带依赖)

如果Spark环境已自带Spark核心依赖,可通过参数排除,减少Jar包体积:

mvn org.apache.maven.plugins:maven-dependency-plugin:3.2.0:copy \
-Dartifact=io.delta:delta-spark_2.13:3.1.0 \
-DremoteRepositories=https://repo.maven.apache.org/maven2/ \
-DoutputDirectory=~/your-target-directory \
-Dtransitive=true \
-DexcludeGroupIds=org.apache.spark

后续操作

执行命令后,目标目录会包含Delta Lake主Jar包及所有依赖Jar包,可通过以下方式加载到Spark:

  • 通过spark-submit的--jars参数指定目录下所有Jar包:spark-submit --jars ~/your-target-directory/*.jar your-app.jar
  • 设置环境变量SPARK_CLASSPATH:export SPARK_CLASSPATH="~/your-target-directory/*"

内容的提问来源于stack exchange,提问作者Callum Dempsey Leach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:28:11