这个问题更侧重于理解maven生活圈而不是解决实际问题。
我们有一个包含多个maven模块的项目。 Jacoco和Surefire插件都在父pom.xml中配置如下:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.0</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/jacoco.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/jacoco.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<argLine>${surefireArgLine}</argLine>
</configuration>
</plugin>
此配置运行良好,并且在执行常见目标时会在目标目录上创建jacoco.exec文件,例如:
mvn clean install
或
mvn test
但是如果我们执行以下命令,则不会创建jacoco.exec文件:
mvn clean install -DskipTests
#other actions here...
mvn jacoco:prepare-agent surefire:test
使用-X选项分析日志,surefire插件表示它将按预期使用argLine属性:
<argLine>${surefireArgLine}</argLine>
目标jococo:prepare-agent正确生成此变量的值:
argLine set to -javaagent:s:\\m2_repo\\org\\jacoco\\org.jacoco.agent\\0.8.0\\org.jacoco.agent-0.8.0-runtime.jar=destfile=S:\\sources\\sofia2-s4c\\config\\services\\target\\jacoco.exec
但是当surefire:test执行时,它不使用argLine属性:
[DEBUG] (s) additionalClasspathElements = []
argLine SHOULD BE HERE!!!!
[DEBUG] (s) basedir = S:\sources\sofia2-s4c\config\services
我们已经解决了这个问题:
mvn clean install -DskipTests
#other actions here...
mvn test
由于mvn测试检测到编译类没有变化,这是有效的。但我想理解为什么第一种方法不起作用。