maven-dependency-plugin 的 unpack 目标可自动下载并解压 maven 仓库中的 zip 等资源,需以合法坐标发布、配置 artifactitem 指定 groupid/artifactid/version/type/outputdirectory/includes 等参数,绑定到 process-resources 阶段;非仓库资源需先入库或改用 wagon-maven-plugin 等替代方案。

在 Maven 构建过程中自动下载并解压外部资源,常用方式是使用 maven-dependency-plugin 的 unpack 目标,配合 artifactItem 配置项实现。它不“下载并解压插件”,而是利用该插件的能力来处理依赖(包括非 jar 的 zip/tar 等包)。
确认目标资源可作为 Maven 依赖访问
要通过 artifactItem 下载,资源必须以合法的 Maven 坐标(groupId:artifactId:version)发布在某个仓库中(如中央仓库、私有 Nexus/Artifactory 或本地 repo)。如果是普通 HTTP 地址(如 raw.githubusercontent.com 的 zip),maven-dependency-plugin 默认不支持直接拉取——需先将其发布为带 packaging=zip 的 Maven 依赖,或改用 wagon-maven-plugin + 自定义脚本。
- 推荐做法:将 zip 包部署到私有仓库,声明为
<packaging>zip</packaging>的模块 - 验证方式:在项目中添加该依赖(scope=provided 或 compile),执行
mvn dependency:copy-dependencies看能否拉取成功
配置 maven-dependency-plugin 的 unpack 目标
在 pom.xml 的 <build><plugins></plugins></build> 中添加插件配置,绑定到 process-resources 或 generate-resources 生命周期阶段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-dependency-plugin</artifactid><version>3.6.0</version><executions><execution><id>unpack-external-resources</id><phase>process-resources</phase><goals><goal>unpack</goal></goals><configuration><artifactitems><artifactitem><groupid>com.example</groupid><artifactid>my-assets</artifactid><version>1.2.0</version><type>zip</type><outputdirectory>${project.build.outputDirectory}/static/thirdparty</outputdirectory><includes>**/*.js,**/*.css</includes></artifactitem></artifactitems></configuration></execution></executions></plugin>
-
<type>zip</type>必须与实际打包类型一致(也可为tar.gz,但需对应 classifier) -
<outputdirectory></outputdirectory>是解压目标路径,建议用 Maven 属性(如${project.build.directory}或${project.build.outputDirectory}) -
<includes></includes>和<excludes></excludes>可精细控制解压内容,避免冗余文件
处理 classifier 或 snapshot 版本
若资源带 classifier(如 my-assets-1.2.0-dist.zip),需显式指定:
<classifier>dist</classifier>
对于 SNAPSHOT 版本,Maven 会自动检查更新;如需强制刷新,加 -U 参数运行构建,或配置 <overwritereleases>false</overwritereleases> 控制覆盖行为。
- SNAPSHOT 解压结果默认不会随每次构建重写——除非设置
<overwriteifnewer>true</overwriteifnewer> - 多个
artifactItem可并列写在<artifactitems></artifactitems>内,分别处理不同资源
替代方案:当资源不在 Maven 仓库时
如果 zip 只有 URL(如 GitHub Release 下载链接),maven-dependency-plugin 无法直接处理。此时可:
- 用
exec-maven-plugin调用curl/wget+unzip(跨平台兼容性差) - 用
wagon-maven-plugin的download-single目标(需配置 wagon-http 扩展) - 更稳妥的做法:CI 流程中预先下载并推送到私有仓库,保持构建纯 Maven 化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










