为何Maven update-properties不更新dagger.version?如何解决?
使用display-dependency-updates检测到com.google.dagger:dagger有新版本(2.52→2.53.1),但update-properties目标完全不处理dagger.version属性,display-property-updates也忽略该属性;而定义方式相同的jooq.version可以正常被处理。
dagger.version用于配置常规依赖版本,以及kotlin-maven-plugin的注解处理器路径;jooq.version用于常规依赖和插件依赖版本。怀疑是在插件配置中使用该属性导致Versions插件忽略它,求问原因及解决办法。
相关日志及配置
依赖更新检测日志
[INFO] The following dependencies in Dependencies have newer versions: [INFO] com.google.dagger:dagger .............................. 2.52 -> 2.53.1
update-properties执行日志
[INFO] --- versions:2.18.0:update-properties (default-cli) @ server --- [INFO] Property ${jooq.version}: Leaving unchanged as 3.19.16
display-property-updates执行日志
[INFO] The following version properties are referencing the newest available version: [INFO] ${jooq.version} ............................................. 3.19.16
版本属性定义
<dagger.version>2.52</dagger.version> <jooq.version>3.19.16</jooq.version>
Kotlin Maven插件配置(使用dagger.version的部分)
<groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <jvmTarget>${jvm.release}</jvmTarget> <args> <arg>-Xcontext-receivers</arg> </args> </configuration> <executions> <execution> <id>kapt</id> <goals> <goal>kapt</goal> </goals> <configuration> <annotationProcessorPaths> <annotationProcessorPath> <groupId>com.google.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>${dagger.version}</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </execution>
原因分析
Versions插件的update-properties目标默认仅追踪直接在<dependencies>或<dependencyManagement>块中引用的版本属性,而插件配置(比如kotlin-maven-plugin的annotationProcessorPaths)里的属性引用,默认不在插件的扫描范围内。
jooq.version能被正常处理,是因为它同时在常规依赖中被直接引用,插件可以关联到对应的依赖坐标,从而识别该属性需要更新;而dagger.version要么是通过依赖传递间接引用,要么插件的扫描逻辑未覆盖annotationProcessorPaths这类插件内部的依赖配置,导致无法把dagger.version和com.google.dagger:dagger的版本更新关联起来。
解决方法
方法1:显式在dependencyManagement中声明dagger依赖
在项目的<dependencyManagement>块中添加com.google.dagger:dagger和dagger-compiler的显式声明,绑定dagger.version属性:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.dagger</groupId> <artifactId>dagger</artifactId> <version>${dagger.version}</version> </dependency> <dependency> <groupId>com.google.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>${dagger.version}</version> </dependency> </dependencies> </dependencyManagement>
这样Versions插件就能明确关联dagger.version到对应的依赖坐标,从而在update-properties时检测并更新该属性。
方法2:配置Versions插件的propertyIncludes规则
如果不想添加dependencyManagement,可以在Versions插件的配置中,显式指定要处理的dagger.version属性,同时关联对应的依赖坐标:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.18.0</version> <configuration> <propertyIncludes> <propertyInclude>dagger.version</propertyInclude> <propertyInclude>jooq.version</propertyInclude> </propertyIncludes> <dependencyIncludes> <dependencyInclude>com.google.dagger:*</dependencyInclude> </dependencyIncludes> </configuration> </plugin> </plugins> </build>
方法3:升级Versions插件版本
该问题已在Versions插件的社区仓库提交反馈,后续版本可能会修复annotationProcessorPaths这类插件内部依赖的属性扫描问题。可以尝试升级到最新版本的插件,验证是否解决该问题。
内容的提问来源于stack exchange,提问作者Jakub Bochenski

