You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:52:39