maven的mvn dependency依赖分析和常用命令介绍
在项目开发过程中,我们经常会有分析项目依赖的需要,查找jar依赖路径,查找jar冲突等等。这时候,dependency命令会非常的有用,在此我们介绍下关于maven的dependency命令的一些用法。
1. mvn dependency:list
---- 列出项目的所有jar包
mvn dependency:list -Dverbose
该命令可以列出项目依赖的所有jar包,-Dverbose参数会把被忽略的jar,即相同jar包的不同版本引入也列出来。
输出示例:
[INFO] org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO] org.hibernate.validator:hibernate-validator:jar:6.0.9.Final:compile
[INFO] com.fasterxml.jackson.core:jackson-core:jar:2.9.5:compile
[INFO] com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.5:compile
[INFO] org.springframework:spring-expression:jar:5.0.6.RELEASE:compile
[INFO] org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE:compile
[INFO] org.springframework.boot:spring-boot-starter-logging:jar:2.0.2.RELEASE:compile
[INFO] org.yaml:snakeyaml:jar:1.19:runtime
[INFO] org.springframework.boot:spring-boot:jar:2.0.2.RELEASE:compile
[INFO] junit:junit:jar:3.8.1:test
2. mvn dependency:tree
---- 列出项目的包依赖树
mvn dependency:tree -Dverbose
这个命令跟上一个命令的区别就是,这个命令的依赖,输出来是个树,更方便看依赖关系。
输出示例:
[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.0.2.RELEASE:compile
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE:compile
[INFO] | \- org.springframework:spring-core:jar:5.0.6.RELEASE:compile
[INFO] | \- org.springframework:spring-jcl:jar:5.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:5.0.6.RELEASE:compile
[INFO] | \- org.springframework:spring-beans:jar:5.0.6.RELEASE:compile
[INFO] \- org.springframework:spring-webmvc:jar:5.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:5.0.6.RELEASE:compile
[INFO] \- org.springframework:spring-expression:jar:5.0.6.RELEASE:compile
dependency:tree
有几个比较重要的参数,非常有用:
- includes
- 说明:该参数可以列出指定要求的jar,其他的忽略
- 示例:
-Dincludes=velocity:velocity
,只列出velocity的依赖关系 - 参数值:
[groupId]:[artifactId]:[type]:[version]
,参数格式就是这样的,没有的值可以留空,举例-Dincludes=:spring-aop
,-Dincludes=:::5.0.6.RELEASE
,-Dincludes=org.springframework
- 通配符:在参数中可以使用通配符,例如
org.apache.*
,:::*-SNAPSHOT
- 多个参数值:参数后面可以跟多个参数值,以英文逗号分隔,举例
-Dincludes=org.apache.maven*,org.codehaus.plexus
- excludes
- 说明:该参数的用法跟
includes
是一样的,不过这个参数的作用是排除指定的jar
示例:查看包冲突
比如我们查看一下commons-collections
包的冲突
命令:
mvn dependency:tree -Dverbose -Dincludes=commons-collections
输出:
[INFO] [dependency:tree]
[INFO] org.apache.maven.plugins:maven-dependency-plugin:maven-plugin:2.0-alpha-5-SNAPSHOT
[INFO] +- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:compile
[INFO] | \- commons-validator:commons-validator:jar:1.2.0:compile
[INFO] | \- commons-digester:commons-digester:jar:1.6:compile
[INFO] | \- (commons-collections:commons-collections:jar:2.1:compile - omitted for conflict with 2.0)
[INFO] \- org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-8:compile
[INFO] \- org.codehaus.plexus:plexus-velocity:jar:1.1.3:compile
[INFO] \- commons-collections:commons-collections:jar:2.0:compile
我们可以看到,2.1版本的jar被忽略掉了,因为maven是根据路径最近原则来解析依赖,2.0版本路径更短,所以2.0版本被引入,2.1版本路径比2.0要长,所以被忽略。
使用这个命令可以轻松的查看包的引入路径,包的冲突情况。
此处一定不要省略-Dverbose
参数,要不然是不会显示被忽略的包
3. dependency:analyze-only
---- 分析依赖
dependency:analyze-only
命令可以分析整个项目,并且找出项目中依赖有如下情况的:
- 声明了并且使用了的依赖
- 没有声明但是使用了的依赖
- 声明了但是没有使用的依赖
输出示例:
[INFO] Used declared dependencies found:
[INFO] cn.hutool:hutool-all:jar:4.3.1:compile
[INFO] com.google.guava:guava:jar:27.0.1-jre:compile
[WARNING] Used undeclared dependencies found:
[WARNING] org.slf4j:slf4j-api:jar:1.7.25:compile
[WARNING] org.springframework:spring-context:jar:4.3.22.RELEASE:compile
[WARNING] org.springframework.boot:spring-boot-autoconfigure:jar:1.5.19.RELEASE:compile
[WARNING] org.springframework.boot:spring-boot:jar:1.5.19.RELEASE:compile
[WARNING] org.springframework:spring-beans:jar:4.3.22.RELEASE:compile
[WARNING] junit:junit:jar:4.12:test
[WARNING] Unused declared dependencies found:
[WARNING] org.springframework.boot:spring-boot-starter-test:jar:1.5.19.RELEASE:test
[WARNING] com.h2database:h2:jar:1.4.197:test
[WARNING] org.springframework.boot:spring-boot-starter:jar:1.5.19.RELEASE:compile
[WARNING] com.fasterxml.jackson.core:jackson-databind:jar:2.8.11.3:compile
[WARNING] org.projectlombok:lombok:jar:1.16.22:compile
[WARNING] com.alibaba:fastjson:jar:1.2.55:compile
需要注意的是,如果你要查看声明了并且使用了的依赖,必须加上参数-Dverbose
。
4. dependency:analyze-duplicate
---- 分析<dependencies/> and <dependencyManagement/>
这个命令会查找<dependencies/> 和 <dependencyManagement/>
中重复声明的依赖
5. dependency:list-repositories
---- 列出所有的远程repositories
命令:
mvn dependency:list-repositories
输出:
[INFO] id: sonatype-nexus-snapshots
url: https://oss.sonatype.org/content/repositories/snapshots
layout: default
snapshots: [enabled => true, update => daily]
releases: [enabled => false, update => daily]
[INFO] id: apache.snapshots
url: https://repository.apache.org/snapshots
layout: default
snapshots: [enabled => true, update => daily]
releases: [enabled => false, update => daily]
[INFO] id: central
url: https://repo.maven.apache.org/maven2
layout: default
snapshots: [enabled => false, update => daily]
releases: [enabled => true, update => daily]
6. dependency:purge-local-repository
---- 清理本地repository
这个命令的会首先解析整个项目的依赖,然后从本地repository中清理这些依赖,重新从远程repository下载。
- 直接依赖
有一点要说清楚,这个命令默认的对所有的依赖项进行操作。所以它会在清除操作之前,下载某些缺失的依赖来收集完整的依赖树信息。为了避免这些预下载的操作,你可以设置参数-DactTransitively=false
,仅对项目的直接依赖进行操作。 - 指定/排除依赖
你也可以有针对性的只操作某些包,需要添加参数-Dincludes
,明确的声明包,这个是可以传多个值的,用英文逗号分隔,举例:dependency:purge-local-repository -Dincludes=org.slf4j:slf4j-api,org.slf4j:log4j-over-slf4j
。-Dexcludes
也是一样的道理,只不过是排除某些依赖。 - 自定义清理
如果你想清理不在本项目中的依赖,也可以使用这个,不过参数是不一样的。mvn dependency:purge-local-repository -DmanualIncludes=org.apache:apache
,参数-DmanualInclude
可以让你清理不在本项目中的依赖,但是不会重新解析依赖了,因为本项目不需要这些依赖。这个对清理parent pom,导入的pom,maven插件非常有用。