# 依赖分析
mvn dependency:list
# 列出项目的所有jar包
mvn dependency:list -Dverbose
#该命令可以列出项目依赖的所有jar包,-Dverbose参数会把被忽略的jar,即相同jar包的不同版本引入也列出来。
- mvn dependency:tree
列出项目的包依赖树 这个命令跟上一个命令的区别就是,这个命令的依赖,输出来是个树,更方便看依赖关系。
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
- dependency:analyze-only
分析依赖
dependency:analyze-only命令可以分析整个项目,并且找出项目中依赖有如下情况的:
- 声明了并且使用了的依赖
- 没有声明但是使用了的依赖
- 声明了但是没有使用的依赖
- 需要注意的是,如果你要查看声明了并且使用了的依赖,必须加上参数
-Dverbose
- mvn dependency:analyze
分析maven依赖情况,可对无用依赖排除以减小jar包
dependency:analyze-duplicate
分析
这个命令会查找<dependencies/> 和 <dependencyManagement/>中重复声明的依赖
dependency:list-repositories
---- 列出所有的远程repositories
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插件非常有用。
# Maven
# scope
compile 默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。默认的scope,在部署的时候将会打包到lib目录下,项目在编译,测试,运行阶段都需要
test scope为test表示依赖项目仅仅参与测试相关的工作,在编译和运行环境下都不会被使用,更别说打包了。
runntime runntime这个scope,仅仅适用于运行环境,在编译和测试环境下都不会被使用
provided provided适合在编译和测试的环境,他和compile很接近,但是provide仅仅需要在编译和测试阶段,同样provide将不会被打包到lib目录下。
system 从参与度来说,也provided相同,不过被依赖项不会从maven (opens new window)仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
scope的依赖传递 A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是: 当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的scope继承于B的scope。
scope的依赖传递 A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是: 当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的scope继承于B的scope。