Maven项目安装失败:Jacoco相关测试报错求助
java.lang.NoSuchFieldException: $jacocoAccess 根据你描述的报错信息,这个问题几乎可以确定是Jacoco版本与JDK版本不兼容或者Jacoco与Surefire插件的配合配置存在冲突导致的——毕竟你提到在其他电脑能正常运行,说明代码本身没问题。下面是几个针对性的解决方案,按优先级尝试:
1. 升级Jacoco到兼容当前JDK的版本
从报错里的org.jacoco.agent.rt.internal_c13123e来看,你的Jacoco版本可能比较旧,而JDK9+的模块系统会限制对核心类(比如java.lang.UnknownError)的instrument操作。建议升级到Jacoco 0.8.7及以上版本(这个版本开始更好地支持JDK11+)。
在你的pom.xml中更新Jacoco插件配置:
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.11</version> <!-- 最新稳定版,兼容JDK8-JDK21 --> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
2. 调整Surefire插件的fork模式配置
有时候Surefire的fork配置会影响Jacoco agent的加载,尝试显式设置fork模式为always,确保每个测试用例都在独立的JVM中运行,避免类加载冲突:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <!-- 同步升级到较新版本,兼容Jacoco --> <configuration> <forkCount>1</forkCount> <reuseForks>false</reuseForks> </configuration> </plugin>
3. 清理Maven缓存并重新构建
本地Maven仓库的依赖可能损坏或版本不一致,执行以下命令清理缓存并重新下载依赖:
mvn clean install -U
-U参数会强制更新快照依赖,确保你拿到的是正确版本的Jacoco和Surefire插件。
4. 确认JDK版本与其他电脑一致
检查本地JDK版本是否和其他能正常运行的电脑相同:
java -version mvn -v # 确认Maven实际使用的JDK版本
如果本地用的是JDK17而其他电脑是JDK11,可能会出现这类兼容性问题,建议切换到一致的JDK版本。
5. 排除系统类的Jacoco Instrumentation
如果上面的方法都不行,可以尝试让Jacoco跳过对java.lang包下类的instrument操作,避免触发核心类的访问限制:
在Jacoco插件配置中添加排除规则:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.11</version> <configuration> <excludes> <exclude>java/lang/**</exclude> </excludes> </configuration> <!-- 保留之前的executions配置 --> </plugin>
这些方案应该能解决你遇到的问题,毕竟核心冲突就是Jacoco和JDK/Surefire的兼容性问题,按顺序尝试即可。
内容的提问来源于stack exchange,提问作者Eugen

