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
相关产品推荐
相关产品推荐

