Problemi con i plugin Maven infallibili con Jacoco, JMockit e JDK14

Sep 12 2020

Ho provato ad aggiornare il mio progetto da JDK 11 a JDK 14, ma l'esecuzione dei test non è riuscita dopo aver impostato la versione java su 14. Dato che sto usando jacoco in combinazione con JMockit, ho configurato la mia build come segue (modifica: la versione JaCoCo è 0.8.3 / 0.8.5, JMockit versione 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 eseguo Maven con la versione Java impostata su 11, tutto funziona correttamente, ma quando imposto la versione Java su 14 il plugin infallibile genera questo errore:

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

Ho rintracciato il problema in @ {argLine} nella configurazione dell'argline infallibile. Se lo rimuovo, la build funziona perfettamente. Purtroppo questa configurazione è necessaria a JaCoCo. Senza di esso non produce alcun report.

Eventuali suggerimenti?

Addendum: Ho appena scoperto che i test falliscono durante l'esecuzione con JDK14. Non dipende dalla versione di compilazione impostata nel pom.

Risposte

3 Godin Sep 14 2020 at 14:58

Secondo il changelog di JaCoCo (https://www.jacoco.org/jacoco/trunk/doc/changes.html) il supporto per i file di classe Java 14 è stato aggiunto in JaCoCo versione 0.8.5, tuttavia l'ultima versione di oggi JMockit versione 1.49 non supporta ancora completamente il bytecode Java 11 - vedere un ticket aperto in JMockit https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439 :

JMockit dovrebbe essere corretto per gestire correttamente condy (https://openjdk.java.net/jeps/309).

Valeesi Nov 10 2020 at 20:09

Per coloro che non hanno urgente bisogno delle campane e dei fischietti di JDK14 +, solo l'aggiornamento a JDK13 potrebbe impedire che questo problema si verifichi.