Problèmes de plugin Maven surefire avec Jacoco, JMockit et JDK14
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
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).
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.