No se puede compilar un proyecto Java 10 / Java 11 simple con Maven

134

Tengo un proyecto trivial de Maven:

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>

Cuando construyo el proyecto vía mvn -X install -DskipTests=true, falla:

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

¿Hay alguna manera de arreglar esto?

ZhekaKozlov
fuente
1
@MikhailKholodkov El error se ha resuelto y ahora se puede utilizar maven-compiler-plugin:3.8.0para corregir el error anterior .
Naman

Respuestas:

162

A partir del 30 de julio de 2018 para solucionar el problema anterior, se puede configurar la versión de Java utilizada dentro de Maven para cualquier hasta JDK / 11 y hacer uso del maven-compiler-plugin:3.8.0para especificar una versión de 9,10,11 sin ninguna dependencia explícita .

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

Nota : - El valor predeterminado para el origen / destino se ha elevado de 1.5 a 1.6 con esta versión. - Notas de la versión.


Editar [30.12.2018]

De hecho, puede utilizar la misma versión de maven-compiler-pluginmientras compila el código contra JDK / 12 también.

Más detalles y una configuración de muestra sobre cómo compilar y ejecutar una función de vista previa JDK con Maven .

Naman
fuente
66
Esto solo funciona cuando Maven se ejecuta con Java 11. Si la versión de Java de su plataforma es, por ejemplo, Java 8 (y así Maven se ejecuta con Java 8), debe definir una cadena de herramientas maven.apache.org/guides/mini /guide-using-toolchains.html
Franz Deschler
8
Tenga en cuenta que la propiedad asociada es maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire
@ OlivierGrégoire - Entonces, ¿podemos reemplazar este código con el que usted dio? <properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties>
MasterJoe
1
@ MasterJoe2 Sí, debería poder hacerlo, dado que está actualizando a Java-11.
Naman
136

ACTUALIZAR

La respuesta ahora es obsoleta. Mira esta respuesta .


maven-compiler-plugindepende de la versión anterior de ASM que aún no es compatible con Java 10 (y Java 11). Sin embargo, es posible especificar explícitamente la versión correcta de 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>

Puede encontrar lo último en https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav

ZhekaKozlov
fuente
¿Consideraría cambiar la respuesta aceptada a la propuesta al comienzo de su publicación?
leopal
24

Parece necesario aumentar su complemento maven-compiler a 3.8.0 pero no es suficiente. Si todavía tiene problemas, también debe asegurarse de que su variable de entorno JAVA_HOME esté configurada en Java 10 (u 11) si está ejecutando desde la línea de comandos. (El mensaje de error que recibe no le dirá esto). O si está ejecutando desde un IDE, debe asegurarse de que esté configurado para ejecutar maven con su JDK actual.

Miguel Muñoz
fuente
14

Puede que no sea exactamente el mismo error, pero tuve uno similar.

Verifique la versión Java de Maven

Dado que Maven también se está ejecutando con Java, verifique primero con qué versión se está ejecutando su Maven:

mvn --version | grep -i java 

Vuelve:

Java versión 1.8.0_151, proveedor: Oracle Corporation, tiempo de ejecución: C: \ tools \ jdk \ openjdk1.8

Versión incompatible

Aquí arriba mi maven está corriendo con Java Version 1.8.0_151. Entonces, incluso si especifico maven para compilar con 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>

Lógicamente imprimirá este error:

[ERROR] Error al ejecutar el objetivo org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: compile (default-compile) on project efa-example-commons-task: Error fatal al compilar: versión de destino no válida: 11 -> [Ayuda 1]

Cómo configurar una versión específica de Java para Maven

Lo lógico es configurar una versión Java más alta en Maven (por ejemplo, Java versión 11 en lugar de 1.8).

Maven hace uso de la variable de entorno JAVA_HOMEpara encontrar la versión de Java para ejecutar. Por lo tanto, cambie esta variable al JDK con el que desea compilar (por ejemplo, OpenJDK 11).

Prueba de cordura

Luego, vuelva mvn --versiona ejecutar para asegurarse de que la configuración se haya solucionado:

mvn --version | grep -i java

rendimientos

Versión de Java: 11.0.2, proveedor: Oracle Corporation, tiempo de ejecución: C: \ tools \ jdk \ openjdk11

Lo cual es mucho mejor y correcto compilar código escrito con las especificaciones de Java 11.

KeyMaker00
fuente
1
Esto funcionó para mí, también cuando
utilizo la
13

Especifique maven.compiler.source y versiones de destino.

1) Versión Maven que admite jdk que utilizas. En mi caso JDK 11 y maven 3.6.0.

2) pom.xml

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

Como alternativa, puede especificar completamente el complemento del compilador maven. Ver respuestas anteriores. Es más corto en mi ejemplo :)

<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) reconstruya el proyecto para evitar errores de compilación en su IDE.

4) Si aún no funciona. En Intellij Idea, prefiero usar terminal en lugar de usar terminal del sistema operativo. Luego, en Idea, vaya a Archivo -> Configuración -> Herramientas de compilación -> Maven. Trabajo con maven que descargué de apache (de forma predeterminada, Idea usa maven incluido). Reinicie Idea entonces y mvn clean installvuelva a correr . También asegúrese de tener las variables de entorno Path , MAVEN_HOME , JAVA_HOME correctas .

También vi esta frase, pero no funciona.

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

Hice algunos proyectos de inicio rápido, que reutilizo en otros proyectos, no dude en verificar:

Yan Khonski
fuente
2

Si está utilizando el arranque de primavera, agregue estas etiquetas en pom.xml.

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

y

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

Puede cambiar la versión de Java a 11 o 13 también en la <maven.compiler.release>etiqueta.

Simplemente agregue las siguientes etiquetas en 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>

Puede cambiar el 11 a 10, 13 también para cambiar la versión de Java. Estoy usando Java 13, que es la última. Esto funciona para mi.

Abhishek
fuente
0

Muy bien, para mí nada funcionó.
Estaba usando un arranque de primavera con hibernación. La versión de arranque de primavera era ~ 2.0.1 y seguiría obteniendo este error y una excepción de puntero nulo en la compilación. El problema era con la hibernación que necesitaba un cambio de versión. Pero después de eso tuve otros problemas que parecían que el procesador de anotaciones no era reconocido, así que decidí cambiar el lanzamiento de 2.0.1 a 2.1.7 y todo funcionó como se esperaba.

Todavía necesita agregar el complemento anterior resistente ¡
Espero que ayude!

Tudor
fuente