maven-dependency-plugin仅非clean运行时报告未使用依赖,clean验证正常
Maven依赖分析异常:
clean verify通过但单独verify检测到未使用测试依赖 问题详情
- 执行
mvn clean verify时,依赖分析插件输出正常:
[INFO] --- dependency:3.8.1:analyze-only (analyze-only) @ server --- [INFO] No dependency problems found
- 仅执行
mvn verify时,依赖分析报错,检测到多组未使用的测试依赖:
dependency:3.8.1:analyze-only (analyze-only) @ server --- [ERROR] Unused declared dependencies found: [ERROR] org.springframework.cloud:spring-cloud-contract-verifier:jar:4.1.4:test [ERROR] com.toomuchcoding.jsonassert:jsonassert:jar:0.8.0:test [ERROR] com.jayway.jsonpath:json-path:jar:2.9.0:test [ERROR] org.assertj:assertj-core:jar:3.24.2:test
问题原因
这是Spring Cloud Contract插件的增量构建缓存问题:
- 执行
clean verify时,插件会重新生成契约测试源码(默认在target/generated-test-sources/contracts),并将这些源码纳入编译和依赖分析的扫描范围,此时依赖分析能识别到这些测试依赖被生成的代码使用,因此不会报错。 - 仅执行
verify时,Maven复用之前编译好的测试类文件,但Spring Cloud Contract在增量构建流程中,不会主动将生成的测试源码目录告知依赖分析插件。依赖分析插件只能扫描到已编译的测试类,却无法关联到对应的生成源码,导致误判这些依赖“未被使用”。
解决方案
方案1:让依赖分析插件扫描生成的测试源码目录
修改pom.xml中maven-dependency-plugin的配置,明确添加生成的测试源码目录到扫描范围:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.8.1</version> <executions> <execution> <id>analyze-only</id> <goals> <goal>analyze-only</goal> </goals> <configuration> <sourceDirectories> <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory> <sourceDirectory>${project.build.testSourceDirectory}</sourceDirectory> <!-- 加入Spring Cloud Contract生成的测试源码目录 --> <sourceDirectory>${project.build.directory}/generated-test-sources/contracts</sourceDirectory> </sourceDirectories> </configuration> </execution> </executions> </plugin>
方案2:在verify前清理测试类文件
绑定maven-clean-plugin到verify阶段,仅清理测试输出目录,避免复用旧的编译文件干扰分析:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <version>3.3.2</version> <executions> <execution> <id>clean-test-classes</id> <phase>verify</phase> <goals> <goal>clean</goal> </goals> <configuration> <filesets> <fileset> <directory>${project.build.testOutputDirectory}</directory> </fileset> </filesets> </configuration> </execution> </executions> </plugin>
方案3:忽略测试依赖的未使用检查
如果不需要对测试依赖做未使用检测,可以在插件配置中关闭该规则:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.8.1</version> <executions> <execution> <id>analyze-only</id> <goals> <goal>analyze-only</goal> </goals> <configuration> <!-- 忽略非编译范围的依赖检查(即test、provided等) --> <ignoreNonCompile>true</ignoreNonCompile> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者Jakub Bochenski
相关产品推荐
相关产品推荐

