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类文件的支持,但根据JaCo​​Co 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”。