Maven插件:maven-dependency-plugin
2025/10/10大约 5 分钟
Maven依赖插件之maven-dependency-plugin
以下插件配置的作用是什么?配置中的插件是什么插件?通常如何使用该插件?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven-dependency-plugin.version}</version>
<executions>
<execution>
<id>analyze-dependencies</id>
<goals>
<goal>analyze-only</goal>
</goals>
<configuration>
<ignoredDependencies>
<!-- Because of SpringBoot auto-configurations, the configuration is happening outside of your application code, so Maven believes these dependencies to be unused -->
<!-- Static code analysis tools like (maven-dependency-plugin) can not detect runtime dependencies, so you should instruct them about runtime dependencies -->
<!-- https://stackoverflow.com/questions/37528928/spring-boot-core-dependencies-seen-as-unused-by-maven-dependency-plugin -->
<ignoredDependency>org.springframework*:*</ignoredDependency>
<ignoredDependency>org.apache.dolphinscheduler:dolphinscheduler-meter
</ignoredDependency>
</ignoredDependencies>
<ignoreNonCompile>true</ignoreNonCompile>
</configuration>
</execution>
</executions>
</plugin>
# Maven Dependency Plugin配置解析
## 插件基本信息
该配置使用的是**Maven Dependency Plugin**(`org.apache.maven.plugins:maven-dependency-plugin`),这是Maven核心插件之一,主要用于依赖管理相关操作。
## 配置作用分析
这个特定配置主要实现了以下功能:
1. **依赖分析**:通过`analyze-only`目标分析项目依赖关系
- 识别三类依赖:已声明且使用的、已声明但未使用的、未声明但使用的依赖
- 与`dependency:analyze`不同,`analyze-only`假设`test-compile`阶段已执行,适合在构建生命周期中使用
2. **忽略特定依赖**:配置中通过`<ignoredDependencies>`排除了两类依赖
- 所有`org.springframework`开头的依赖(因Spring Boot自动配置机制)
- 特定依赖`org.apache.dolphinscheduler:dolphinscheduler-meter`
- 这种配置避免了因Spring Boot自动配置导致的"未使用依赖"误报
3. **范围过滤**:`<ignoreNonCompile>true</ignoreNonCompile>`表示只分析`compile`范围的依赖,忽略`runtime`、`provided`等其他范围的依赖
## 典型使用场景
1. **依赖优化**:识别并清理未使用的依赖,保持项目整洁
2. **构建验证**:在CI/CD流程中加入此检查,确保依赖声明正确
3. **Spring Boot项目**:特别适用于Spring Boot项目,解决自动配置导致的依赖分析误报问题
## 使用建议
1. **命令执行**:可直接运行`mvn dependency:analyze-only`或作为构建生命周期的一部分执行
2. **结果解读**:注意分析结果可能存在误报(特别是注解驱动的框架如Spring Boot)
3. **参数调整**:根据项目特点调整`ignoredDependencies`和范围过滤参数
此配置特别适合Spring Boot项目,解决了静态分析工具无法识别运行时依赖的问题,同时保持了依赖声明的规范性检查.
Maven Dependency Plugin 提供了多个常用目标(goals),每个目标都有特定的功能用途。以下是该插件最常用的目标及其作用说明:
------
### 1. **dependency:copy**
**作用**:将指定的依赖项从本地或远程仓库复制到指定目录,可自定义输出文件名或去除版本号。
**典型场景**:
- 将特定依赖(如第三方JAR)复制到项目的`lib/`目录
- 构建时重命名依赖文件(如去除版本号)
**示例配置**:2. dependency:copy-dependencies
作用:复制项目的所有依赖(包括传递依赖)到指定目录,支持过滤依赖范围。
典型场景:
- 构建独立部署包时收集所有依赖JAR
- 为离线环境准备依赖库
关键参数: outputDirectory:指定输出路径excludeTransitive:是否排除传递依赖(默认false)stripVersion:是否去除版本号(默认false)
示例命令:
mvn dependency:copy-dependencies -DoutputDirectory=target/lib3. dependency:tree
作用:以树形结构展示项目依赖关系,清晰显示依赖冲突和传递路径。
典型场景:
- 排查版本冲突(如不同模块引用了不同版本的Spring)
- 分析依赖来源(如确定某个依赖为何被引入)
输出示例:
[INFO] com.example:demo:jar:1.0
[INFO] +- org.springframework:spring-core:jar:5.3.8:compile
[INFO] \- org.hibernate:hibernate-core:jar:5.4.32:compile
[INFO] \- javax.persistence:javax.persistence-api:jar:2.2:compile常用参数:
Dverbose:显示冲突详情Dincludes:按groupId过滤(如-Dincludes=org.springframework*)
4. dependency:list
作用:列出项目所有直接和传递依赖,格式为groupId:artifactId:version:scope。
与tree的区别:平铺式列表(无层级关系),适合机器解析。
典型用途:
- 生成依赖清单文件
- 与其他工具(如CI系统)集成时获取依赖列表
示例输出:
org.springframework:spring-core:jar:5.3.8:compile
org.hibernate:hibernate-core:jar:5.4.32:compile5. dependency:unpack
作用:解压指定依赖到目录(如提取JAR中的资源文件或类文件)。
典型场景:
- 获取依赖中的配置文件或脚本
- 分离第三方库中的特定资源(如模板文件)
示例配置:
<execution>
<goals><goal>unpack</goal></goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<outputDirectory>${project.build.directory}/unpack/slf4j</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>6. dependency:sources
作用:下载依赖的源码包到本地仓库(便于IDE调试时查看源码)。
配套命令:
dependency:resolve:仅解析依赖(不下载)dependency:resolve-plugins:解析插件依赖
示例命令:
mvn dependency:sources其他实用目标
| 目标 | 作用 | 适用场景 |
|---|---|---|
analyze | 分析依赖使用情况(比analyze-only更严格) | 检查未声明但使用的依赖 |
purge-local-repository | 清理本地仓库中的依赖 | 强制重新下载依赖 |
build-classpath | 生成类路径字符串 | 脚本化启动应用 |
使用建议
- 组合使用:例如先用
tree分析依赖关系,再用copy-dependencies打包。 - 生命周期绑定:如将
copy-dependencies绑定到package阶段实现自动化。 - 参数调优:通过
<configuration>细化控制(如过滤特定Scope的依赖)。
完整目标列表可参考官方文档。