如何解决Jacoco,JMockit和JDK14的Maven surefire插件问题
我试图将项目从JDK 11升级到JDK 14,但是在将Java版本设置为14之后运行测试失败。由于我将jacoco与JMockit结合使用,因此我的构建如下配置(编辑:JaCoCo版本为0.8.3 / 0.8.5,JMockit版本1.49):
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${version.jacoco}</version>
<executions>
<execution>
<id>coverage-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>coverage-report</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire-plugin}</version>
<configuration>
<argLine>
@{argLine} -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${version.jmockit}/jmockit-${version.jmockit}.jar
</argLine>
</configuration>
</plugin>
...
如果我在Java版本设置为11的情况下运行maven,则一切正常,但是当我将Java版本设置为14时,surefire插件会引发以下错误:
[ERROR] java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
[ERROR] at org.jacoco.agent.rt.internal_1f1cc91.CoverageTransformer.transform(CoverageTransformer.java:93)
[ERROR] sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo
[ERROR] at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
[ERROR] at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
[ERROR] at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
[ERROR] at java.base/java.lang.classLoader.defineClass2(Native Method)
[ERROR] at java.base/java.lang.classLoader.defineClass(ClassLoader.java:1109)
我在surefire argline的配置中将问题归结为@ {argLine}。如果删除此选项,则构建运行正常。不幸的是,JaCoCo需要此配置。没有它,它不会产生任何报告。
有什么建议吗?
附录:刚发现,使用JDK14运行时测试失败。它不取决于pom中设置的编译版本。
解决方法
JaCoCo版本0.8.5中增加了对Java 14类文件的支持,但根据JaCoCo changelog(https://www.jacoco.org/jacoco/trunk/doc/changes.html),到目前为止,最新的JMockit版本1.49仍不完全支持Java 11字节码-请参阅公开票在JMockit https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439中:
,JMockit应该被修复以正确处理condy(https://openjdk.java.net/jeps/309)。
对于那些急需JDK14 +的人来说,仅升级到JDK13可以防止此问题的发生。
,访问https://www.jacoco.org/jacoco/trunk/doc/changes.html
它清楚地提到了对 JDK 14 的支持。将“jacoco-maven-plugin”更新为“0.8.6”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。