Problèmes de plugin Maven surefire avec Jacoco, JMockit et JDK14

Sep 12 2020

J'ai essayé de mettre à niveau mon projet de JDK 11 à JDK 14, mais l'exécution des tests a échoué après avoir défini la version java sur 14. Comme j'utilise jacoco en combinaison avec JMockit, j'ai configuré ma construction comme suit (modifier: la version JaCoCo est 0.8.3 / 0.8.5, JMockit version 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>
...

Si j'exécute maven avec la version Java définie sur 11, tout fonctionne correctement, mais lorsque je règle la version Java sur 14, le plugin infaillible renvoie cette erreur:

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

J'ai retracé le problème sur @ {argLine} dans la configuration de l'argline infaillible. Si je supprime cela, la construction fonctionne très bien. Malheureusement, cette configuration est nécessaire à JaCoCo. Sans cela, il ne produit aucun rapport.

Aucune suggestion?

Addendum: Je viens de comprendre que les tests échouent lors de l'exécution avec JDK14. Cela ne dépend pas de la version de compilation définie dans le fichier pom.

Réponses

3 Godin Sep 14 2020 at 14:58

Selon le journal des modifications JaCoCo (https://www.jacoco.org/jacoco/trunk/doc/changes.html) la prise en charge des fichiers de classe Java 14 a été ajoutée dans JaCoCo version 0.8.5, mais la dernière version d'aujourd'hui JMockit version 1.49 ne prend toujours pas entièrement en charge le bytecode Java 11 - voir un ticket ouvert dans JMockit https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439 :

JMockit doit être corrigé pour gérer correctement condy (https://openjdk.java.net/jeps/309).

Valeesi Nov 10 2020 at 20:09

Pour ceux qui n'ont pas besoin d'urgence des cloches et des sifflets du JDK14 +, seule la mise à niveau vers JDK13 peut empêcher ce problème de se produire.