Problemas infalíveis do plugin Maven com Jacoco, JMockit e JDK14

Sep 12 2020

Tentei atualizar meu projeto do JDK 11 para o JDK 14, mas os testes falharam depois de definir a versão java para 14. Como estou usando o jacoco em combinação com o JMockit, configurei minha construção da seguinte maneira (editar: JaCoCo version is 0.8.3 / 0.8.5, JMockit versão 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>
...

Se eu executar o maven com a versão do Java definida como 11, tudo funcionará bem, mas quando eu definir a versão do Java como 14, o plug-in infalível gera este erro:

[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)

Rastreei o problema para @ {argLine} na configuração do argline infalível. Se eu remover isso, a compilação funcionará bem. Infelizmente, esta configuração é necessária para JaCoCo. Sem ele, não produz nenhum relatório.

Alguma sugestão?

Adendo: Acabei de descobrir que os testes falham quando executados com JDK14. Não depende da versão de compilação definida no pom.

Respostas

3 Godin Sep 14 2020 at 14:58

De acordo com o changelog JaCoCo (https://www.jacoco.org/jacoco/trunk/doc/changes.html) foi adicionado suporte para arquivos de classe Java 14 no JaCoCo versão 0.8.5, no entanto, a partir de hoje, o JMockit versão 1.49 ainda não oferece suporte total ao bytecode Java 11 - veja um tíquete aberto no JMockit https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439 :

JMockit deve ser corrigido para lidar adequadamente com condy (https://openjdk.java.net/jeps/309)

Valeesi Nov 10 2020 at 20:09

Para aqueles que não precisam urgentemente dos sinos e assobios do JDK14 +, apenas a atualização para o JDK13 pode evitar que esse problema aconteça.