Maven多模块项目编译阶段如何忽略缺失的测试依赖?
我有一个多模块Maven项目,包含一个共享测试模块。在其他模块中通过以下依赖引入测试模块:
<dependency> <groupId>org.example</groupId> <artifactId>some-test-module</artifactId> <version>${project.parent.version}</version> <type>test-jar</type> <scope>test</scope> </dependency>
首次执行mvn clean compile仅构建src/main/java时,出现构建错误:Could not find artifact org.example:some-test-module:jar:tests:0.0.1-SNAPSHOT。但执行mvn clean test-compile时一切正常。请问如何执行mvn compile构建src/main/java时,不依赖当前阶段缺失的test-jar?
核心问题是:即便依赖标记了test scope,Maven执行compile阶段时仍会尝试解析所有依赖(包括test scope的),而test-jar要到test-compile阶段后才会生成,首次执行compile时自然找不到。
以下是几种可行的解决办法:
方法一:执行compile时跳过test依赖解析
直接在命令行添加参数,强制跳过test scope依赖的解析:
mvn clean compile -DexcludeScope=test
如果需要同时跳过测试相关的执行,也可以加上:
mvn clean compile -DskipTests -Dmaven.test.skip=true -DexcludeScope=test
也可以在子模块的pom.xml中配置maven-dependency-plugin,让compile阶段自动跳过test依赖:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>exclude-test-deps</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <excludeScope>test</excludeScope> </configuration> </execution> </executions> </plugin> </plugins> </build>
方法二:拆分测试模块的代码结构
如果共享测试模块里有src/main/java的通用代码(比如测试工具类),把这部分单独拆成一个普通模块(例如some-test-common):
- 新模块
some-test-common只放主代码,打包成普通jar - 原
some-test-module依赖some-test-common,只存放测试相关代码,打包成test-jar - 业务模块主代码若需要测试工具类,直接依赖
some-test-common的普通jar;test代码依赖some-test-module的test-jar
这样mvn compile时只会解析主代码依赖的普通jar,不会涉及未生成的test-jar,从根源解决问题。
方法三:预构建测试模块的test-jar
临时场景下,可以先单独构建测试模块的test-jar,再执行主模块的compile:
# 先构建测试模块的test-jar mvn -f some-test-module/pom.xml clean package -DskipTests # 再执行主编译 mvn clean compile
内容的提问来源于stack exchange,提问作者user15110545

