Impossible de compiler un projet Java 10 / Java 11 simple avec Maven

134

J'ai un projet Maven trivial:

src
└── main
    └── java
        └── module-info.java
pom.xml

pom.xml:

<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <release>10</release>
            </configuration>
        </plugin>
    </plugins>
</build>

Quand je construis le projet via mvn -X install -DskipTests=true , il échoue:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project example: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:145)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        ... 20 more
Caused by: java.lang.IllegalArgumentException
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.codehaus.plexus.languages.java.jpms.AsmModuleInfoParser.parse(AsmModuleInfoParser.java:80)
        at org.codehaus.plexus.languages.java.jpms.AsmModuleInfoParser.getModuleDescriptor(AsmModuleInfoParser.java:54)
        at org.codehaus.plexus.languages.java.jpms.LocationManager.resolvePaths(LocationManager.java:83)
        at org.apache.maven.plugin.compiler.TestCompilerMojo.preparePaths(TestCompilerMojo.java:281)
        at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:762)
        at org.apache.maven.plugin.compiler.TestCompilerMojo.execute(TestCompilerMojo.java:176)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
        ... 21 more

Y'a t'il un moyen d'arranger cela?

ZhekaKozlov
la source
1
@MikhailKholodkov Le bogue a été résolu et on peut maintenant utiliser le maven-compiler-plugin:3.8.0pour corriger l'erreur ci-dessus .
Naman

Réponses:

164

À partir du 30 juillet 2018, pour résoudre le problème ci-dessus, on peut configurer la version java utilisée dans maven sur tout JDK / 11 et utiliser le maven-compiler-plugin:3.8.0 pour spécifier une version de 9,10,11 sans aucune dépendance explicite .

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>11</release>  <!--or <release>10</release>-->
    </configuration>
</plugin>

Remarque : - La valeur par défaut pour la source / la cible est passée de 1,5 à 1,6 avec cette version. - notes de version.


Modifier [30.12.2018]

En fait, vous pouvez utiliser la même version de maven-compiler-plugin lors de la compilation du code avec JDK / 12.

Plus de détails et un exemple de configuration sur la façon de compiler et d'exécuter une fonction de prévisualisation JDK avec Maven .

Naman
la source
6
Cela ne fonctionne que lorsque maven est exécuté avec Java 11. Si la version Java de votre plate-forme est par exemple Java 8 (et donc maven est exécuté avec Java 8), vous devez définir une chaîne d'outils maven.apache.org/guides/mini /guide-using-toolchains.html
Franz Deschler
8
A noter que le bien associé est maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire
@ OlivierGrégoire - Alors, on peut remplacer ce code par celui que vous avez donné? <properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties>
MasterJoe
1
@ MasterJoe2 Oui, vous devriez pouvoir le faire, étant donné que vous passez à Java-11.
Naman
136

METTRE À JOUR

La réponse est désormais obsolète. Voyez cette réponse .


maven-compiler-plugindépend de l'ancienne version d'ASM qui ne prend pas encore en charge Java 10 (et Java 11). Cependant, il est possible de spécifier explicitement la bonne version d'ASM:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <release>10</release>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>6.2</version> <!-- Use newer version of ASM -->
        </dependency>
    </dependencies>
</plugin>

Vous pouvez trouver la dernière à https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav

ZhekaKozlov
la source
Envisageriez-vous de changer la réponse acceptée par celle proposée au début de votre message?
leopal
24

Booster votre maven-compiler-plugin vers la version 3.8.0 semble être nécessaire mais pas suffisant. Si vous rencontrez toujours des problèmes, vous devez également vous assurer que votre variable d'environnement JAVA_HOME est définie sur Java 10 (ou 11) si vous exécutez à partir de la ligne de commande. (Le message d'erreur que vous recevez ne vous le dira pas.) Ou si vous exécutez à partir d'un IDE, vous devez vous assurer qu'il est configuré pour exécuter maven avec votre JDK actuel.

MiguelMunoz
la source
14

Ce n'est peut-être pas exactement la même erreur, mais j'en ai eu une similaire.

Vérifiez la version Java de Maven

Puisque Maven est également exécuté avec Java, vérifiez d'abord avec quelle version votre Maven fonctionne:

mvn --version | grep -i java 

Il renvoie:

Java version 1.8.0_151, fournisseur: Oracle Corporation, runtime: C: \ tools \ jdk \ openjdk1.8

Version incompatible

Ci-dessus, mon maven court avec Java Version 1.8.0_151. Donc même si je spécifie maven pour compiler avec Java 11:

<properties>
    <java.version>11</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

Il imprimera logiquement cette erreur:

[ERREUR] Échec de l'exécution de l'objectif org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: compile (default-compile) sur le projet efa-example-commons-task: erreur fatale lors de la compilation: version cible non valide: 11 -> [Aide 1]

Comment définir une version Java spécifique sur Maven

La chose logique à faire est de définir une version Java plus élevée sur Maven (par exemple, la version 11 de Java au lieu de 1.8).

Maven utilise la variable d'environnement JAVA_HOMEpour trouver la version Java à exécuter. Changez donc cette variable pour le JDK avec lequel vous voulez compiler (par exemple OpenJDK 11).

Verification sanitaire

Ensuite, exécutez à nouveau mvn --versionpour vous assurer que la configuration a été prise en charge:

mvn --version | grep -i java

rendements

Version Java: 11.0.2, fournisseur: Oracle Corporation, exécution: C: \ tools \ jdk \ openjdk11

Ce qui est bien meilleur et correct pour compiler du code écrit avec les spécifications Java 11.

KeyMaker00
la source
1
Cela a fonctionné pour moi, également lors de l'utilisation de maven-assembly-plugin version 3.2.0
Gérard Binkhorst
13

Spécifiez maven.compiler.source et les versions cible.

1) La version Maven qui prend en charge jdk que vous utilisez. Dans mon cas, JDK 11 et maven 3.6.0.

2) pom.xml

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

Comme alternative, vous pouvez spécifier complètement le plugin du compilateur maven. Voir les réponses précédentes. C'est plus court dans mon exemple :)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
    </plugins>
</build>

3) reconstruisez le projet pour éviter les erreurs de compilation dans votre IDE.

4) Si cela ne fonctionne toujours pas. Dans Intellij Idea, je préfère utiliser le terminal au lieu d'utiliser le terminal du système d'exploitation. Ensuite, dans Idée, allez dans fichier -> paramètres -> outils de construction -> maven. Je travaille avec maven que j'ai téléchargé depuis apache (par défaut, Idea utilise maven fourni). Redémarrez ensuite Idea et mvn clean installrecommencez. Assurez-vous également que vous avez le chemin correct , MAVEN_HOME , JAVA_HOME les variables d'environnement .

J'ai aussi vu ce monoplace, mais cela ne fonctionne pas.

<maven.compiler.release>11</maven.compiler.release>

J'ai réalisé quelques projets de démarrage rapide, que je réutilise dans d'autres de mes projets, n'hésitez pas à vérifier:

Yan Khonski
la source
2

Si vous utilisez Spring Boot, ajoutez ces balises dans pom.xml.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

et

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    `<maven.compiler.release>`10</maven.compiler.release>
</properties>

Vous pouvez également changer la version java en 11 ou 13 dans la <maven.compiler.release>balise.

Ajoutez simplement les balises ci-dessous dans pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.release>11</maven.compiler.release>
</properties>

Vous pouvez également changer le 11 en 10, 13 pour changer la version java. J'utilise java 13 qui est le plus récent. Ça marche pour moi.

Abhishek
la source
0

D'accord, donc pour moi, rien n'a fonctionné.
J'utilisais Spring Boot avec Hibernate. La version Spring Boot était ~ 2.0.1 et je continuerais à obtenir cette erreur et l'exception de pointeur nul lors de la compilation. Le problème était avec la mise en veille prolongée qui nécessitait une modification de version. Mais après cela, j'ai eu d'autres problèmes qui semblaient que le processeur d'annotations n'était pas reconnu, alors j'ai décidé de simplement passer le printemps de la version 2.0.1 à la version 2.1.7 et tout a fonctionné comme prévu.

Vous devez toujours ajouter le plugin ci-dessus, espérons que
cela vous aidera!

Tudor
la source