Maven依赖树中provided scope构件展示差异原因及参数咨询
Maven dependency:tree 对provided依赖展开差异的原因与相关参数
先直接说结论:两台机器的差异大概率和本地仓库的依赖元数据完整性或者系统环境触发的profile差异有关,而控制provided依赖在依赖树中处理行为的核心参数是-Dscope以及插件的includeScope配置。
一、差异产生的具体原因
- 本地仓库的pom文件缺失:Maven构建依赖树时,必须读取对应构件的
pom.xml才能解析它的子依赖。如果其中一台机器的本地仓库里,ru.lt:ul-client和ru.lt:ip-client只有jar文件,没下载对应的pom(比如之前只执行过拉取jar的命令,或者pom下载失败),那dependency:tree就只能显示构件本身,没法展开子依赖;而另一台机器已经完整下载了这两个构件的pom,自然能解析并展示子依赖。 - 系统环境触发不同profile:虽然两台机器的
settings.xml一致,但系统环境(比如操作系统、环境变量、系统属性)不同,可能触发了项目pom中基于系统条件激活的profile。不同profile可能对这两个provided依赖做了特殊配置——比如添加了<exclusions>排除所有子依赖,或者修改了依赖的scope,甚至调整了依赖引入的方式,这都会导致依赖树的展示结果不同。 - 依赖传递性的配置差异:如果其中一个依赖的自身pom里,子依赖被标记为
<optional>true,或者你的项目pom(激活的profile)对这两个依赖做了<exclusions>配置,而另一台机器的项目配置没有这部分内容,也会出现展开结果的差异。不过结合你说的settings相同,这个可能性相对低一些,优先排查前两点。
二、控制provided依赖处理行为的Maven参数
核心是通过dependency:tree插件的参数来控制是否展示、展开provided依赖:
-Dscope命令行参数:这个参数可以指定只展示特定scope的依赖及子依赖。比如执行mvn dependency:tree -Dscope=provided会只显示provided scope的依赖及其子依赖;如果要排除provided依赖,可以用-DexcludeScope=provided。默认情况下,dependency:tree会展示compile、provided、runtime这几个scope的依赖,包括它们的子依赖。- 插件配置中的
includeScope参数:如果需要在pom中固定配置,可以在dependency:tree插件的<configuration>里设置<includeScope>provided</includeScope>,效果和命令行的-Dscope=provided完全一致。 - 补充:如果不想展开某个依赖的子依赖,还可以在项目pom中对该依赖添加
<exclusions>配置,或者使用-Dverbose=false(不过这个是控制是否显示重复依赖,不是专门针对provided的)。
内容的提问来源于stack exchange,提问作者Alexander Fedyukov
相关产品推荐
相关产品推荐

