使用Surefire、Jacoco与JUnit4.12执行单元测试遇IllegalStateException报错求助
解决maven-surefire-plugin抛出java.lang.IllegalStateException: error [STOPPED] to read process的问题
从你的配置和报错堆栈来看,这个问题主要出在Surefire插件的进程检查机制与组件版本兼容性上,下面是几个经过验证的解决思路:
1. 统一Surefire相关依赖版本
你当前maven-surefire-plugin使用的是2.22.0,但依赖的surefire-junit47却是2.21.0,版本不一致很容易引发内部逻辑冲突,这是导致该报错的常见原因之一。把surefire-junit47的版本改成和插件一致的2.22.0即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> <configuration> <skipTests>${skipTests}</skipTests> <forkCount>1</forkCount> <reuseForks>false</reuseForks> </configuration> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.22.0</version> <!-- 与插件版本保持一致 --> </dependency> </dependencies> </plugin>
2. 关闭Surefire的进程存活检查
如果统一版本后问题依然存在,可以尝试禁用Surefire的PpidChecker进程检查机制,这是解决该报错的直接方案。在maven-surefire-plugin的configuration中添加系统属性:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> <configuration> <skipTests>${skipTests}</skipTests> <forkCount>1</forkCount> <reuseForks>false</reuseForks> <!-- 添加以下配置关闭进程检查 --> <systemPropertyVariables> <surefire.disable.ppm>true</surefire.disable.ppm> </systemPropertyVariables> </configuration> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.22.0</version> </dependency> </dependencies> </plugin>
3. 升级Jacoco版本
你使用的Jacoco 0.7.7是比较老旧的版本,可能和Surefire 2.22.0存在兼容性问题。尝试升级到较新的稳定版本(比如0.8.7,这个版本对JUnit4和Surefire的兼容性更好):
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <!-- 升级到稳定新版本 --> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
4. 调整Fork模式作为备选
如果以上方法都无效,可以尝试修改fork配置,比如设置forkCount=0(不创建子进程,直接在Maven主进程内运行测试)。不过这种方式可能和Jacoco的代理机制存在冲突,需要实际测试验证:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> <configuration> <skipTests>${skipTests}</skipTests> <forkCount>0</forkCount> <!-- 禁用子进程fork --> <reuseForks>false</reuseForks> </configuration> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.22.0</version> </dependency> </dependencies> </plugin>
建议按照顺序尝试这些方案,先从版本统一开始,这是最容易解决的点。
内容的提问来源于stack exchange,提问作者medidriss
相关产品推荐
相关产品推荐

