Jacoco、JMockit 和 JDK14 的 Maven Surefire 插件问题

问题描述 投票:0回答:4

我尝试将我的项目从 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中设置的编译版本。

maven jacoco jmockit java-14
4个回答
4
投票

根据 JaCoCo 变更日志 (https://www.jacoco.org/jacoco/trunk/doc/changes.html),JaCoCo 版本 0.8.5 添加了对 Java 14 类文件的支持,但截至今天的最新 JMockit 版本1.49 仍然不完全支持 Java 11 字节码 - 请参阅 JMockit 中的开放票证 https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439 :

应修复 JMockit 以正确处理 condy (https://openjdk.java.net/jeps/309)。


3
投票

访问 https://www.jacoco.org/jacoco/trunk/doc/changes.html

它明确提到可以支持 JDK 14。将“jacoco-maven-plugin”更新为“0.8.6”。


0
投票

对于那些不急需 JDK14+ 的用户,只有升级到 JDK13 才可能避免此问题的发生。


0
投票

使用我的 jmockit 分支,因为它可以处理所有这些。原始存储库已不再活跃多年,而且最近又添加了许多被过去作者删除的旧项目。最新版本确实需要 java 11 才能运行。

参见https://github.com/hazendaz/jmockit1

确保您也是最新的 jacoco 0.8.11,然后您通常应该适合 jdk 22。

© www.soinside.com 2019 - 2024. All rights reserved.