无法使用 Maven 编译简单的 Java 10 / Java 11 项目
Unable to compile simple Java 10 / Java 11 project with Maven
我有一个简单的 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>
当我通过 mvn -X install -DskipTests=true
构建项目时,它失败了:
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
有办法解决这个问题吗?
更新
答案现已过时。见 .
maven-compiler-plugin
取决于不支持 Java 10(和 Java 11)的旧版本 ASM。但是,可以显式指定正确的 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>
您可以在 https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav
找到最新的
自 2018 年 7 月 30 日起解决上述问题,可以将 Maven 中使用的 java 版本配置为最高 JDK/11 并使用 maven-compiler-plugin:3.8.0
指定版本 9、10、11 没有任何显式依赖项.
<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>
注意:- source/target 的默认值已从 1.5 提升到此版本的 1.6。 -- release notes.
编辑 [30.12.2018]
事实上,您也可以在针对 JDK/12 编译代码时使用相同版本的 maven-compiler-plugin
。
有关如何 的更多详细信息和示例配置。
将您的 maven-compiler-plugin
提高到 3.8.0
似乎是必要的,但还不够。如果您仍然遇到问题,您还应该确保您的 JAVA_HOME
环境变量设置为 Java 10(或 11),如果您从命令行 运行ning。 (您收到的错误消息不会告诉您这一点。)或者如果您 运行ning 来自 IDE,您需要确保它已设置为 运行 maven当前 JDK.
指定 maven.compiler.source 和目标版本。
1) 支持jdk您使用的Maven版本。在我的例子中 JDK 11 和 maven 3.6.0.
2) pom.xml
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
作为替代方案,您可以完全指定 maven 编译器插件。请参阅以前的答案。在我的示例中它更短 :)
<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) 重建项目以避免 IDE.
中的编译错误
4) 如果还是不行。在 Intellij Idea 中,我更喜欢使用终端而不是使用来自 OS 的终端。然后在 Idea 中转到文件 -> 设置 -> 构建工具 -> maven。我使用从 apache 下载的 maven(默认情况下 Idea 使用捆绑的 maven)。然后重新启动 Idea,然后再次 运行 mvn clean install
。还要确保你有正确的 Path, MAVEN_HOME, JAVA_HOME 环境变量。
这个单行我也看到了,但是不行
<maven.compiler.release>11</maven.compiler.release>
我制作了一些快速入门项目,我在其他项目中重复使用了这些项目,请随时查看:
这可能不是完全相同的错误,但我遇到了类似的错误。
检查 Maven Java 版本
因为 Maven 也 运行nig Java,请先检查您的 Maven 运行正在使用哪个版本:
mvn --version | grep -i java
它returns:
Java version 1.8.0_151, vendor: Oracle
Corporation, runtime: C:\tools\jdk\openjdk1.8
版本不兼容
这里上面我的maven是运行Java Version 1.8.0_151
。
所以即使我指定 maven 编译 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>
逻辑上会打印出这个错误:
[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile
(default-compile) on project efa-example-commons-task: Fatal error
compiling: invalid target release: 11 -> [Help 1]
如何将特定 java 版本设置为 Maven
合乎逻辑的做法是为 Maven 设置更高的 Java 版本(例如 Java 版本 11 而不是 1.8)。
Maven 使用环境变量 JAVA_HOME
找到 Java 到 运行 的版本。因此,将此变量更改为您要编译的 JDK(例如 OpenJDK 11)。
完整性检查
然后 运行 再次 mvn --version
以确保配置已完成:
mvn --version | grep -i java
产量
Java version: 11.0.2, vendor: Oracle Corporation, runtime: C:\tools\jdk\openjdk11
编译使用 Java 11 规范编写的代码哪个更好更正确。
好吧,对我来说什么都没用。
我正在使用 spring 引导 和 休眠。 spring 引导版本是 ~2.0.1,我会在编译时不断收到此错误和空指针异常。问题出在需要升级版本的 hibernate 上。但在那之后我遇到了一些其他问题,这些问题似乎无法识别注释处理器,所以我决定将 spring 从 2.0.1 升级到 2.1.7 版本,一切都按预期工作。
你还需要添加上面的插件tough
希望对您有所帮助!
如果您使用的是 spring 引导,则在 pom.xml 中添加这些标签。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
和
<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>
您也可以在 <maven.compiler.release>
标签中将 java 版本更改为 11 或 13。
只需在 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>
您可以将 11 更改为 10、13 以及更改 java 版本。我正在使用最新的 java 13。它对我有用。
在我的例子中,虽然终端显示 Java 11,但我不得不在我的脚本中明确地将 JAVA_HOME 设置为 JDK-11版本。
这是因为,我正在通过 shell 脚本执行 mvn
,并且 mvn
使用我机器的默认值 JDK,即 JDK8 .
我确认 mvn
在脚本中使用哪个 JDK 版本并设置为 JDK-11,如下所示:
#!/bin/bash
echo $(java -version)
echo $(mvn --version | grep -i java )
export JAVA_HOME="/opt/jdk11/"
export PATH=$JAVA_HOME/bin:$PATH
echo $(java -version)
echo $(mvn --version | grep -i java )
如果其他方法均无效,甚至在将 JAVA_HOME 设置为 正确的 路径后,请检查 JAVA_HOME 路径中是否没有覆盖 <user>/.mavenrc
!
就我而言,
- "echo $JAVA_HOME" 显示版本 11
- "java -version" 显示版本 11
- 但是,“mvn -version”显示“Java version”不是 11
我将其粘贴到 .bash_profile 的顶部并获取它。有效。
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
alias java8='export JAVA_HOME=$JAVA_8_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
alias java11='export JAVA_HOME=$JAVA_11_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
java11
我有一个简单的 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>
当我通过 mvn -X install -DskipTests=true
构建项目时,它失败了:
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
有办法解决这个问题吗?
更新
答案现已过时。见
maven-compiler-plugin
取决于不支持 Java 10(和 Java 11)的旧版本 ASM。但是,可以显式指定正确的 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>
您可以在 https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav
找到最新的自 2018 年 7 月 30 日起解决上述问题,可以将 Maven 中使用的 java 版本配置为最高 JDK/11 并使用 maven-compiler-plugin:3.8.0
指定版本 9、10、11 没有任何显式依赖项.
<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>
注意:- source/target 的默认值已从 1.5 提升到此版本的 1.6。 -- release notes.
编辑 [30.12.2018]
事实上,您也可以在针对 JDK/12 编译代码时使用相同版本的 maven-compiler-plugin
。
有关如何
将您的 maven-compiler-plugin
提高到 3.8.0
似乎是必要的,但还不够。如果您仍然遇到问题,您还应该确保您的 JAVA_HOME
环境变量设置为 Java 10(或 11),如果您从命令行 运行ning。 (您收到的错误消息不会告诉您这一点。)或者如果您 运行ning 来自 IDE,您需要确保它已设置为 运行 maven当前 JDK.
指定 maven.compiler.source 和目标版本。
1) 支持jdk您使用的Maven版本。在我的例子中 JDK 11 和 maven 3.6.0.
2) pom.xml
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
作为替代方案,您可以完全指定 maven 编译器插件。请参阅以前的答案。在我的示例中它更短 :)
<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) 重建项目以避免 IDE.
中的编译错误4) 如果还是不行。在 Intellij Idea 中,我更喜欢使用终端而不是使用来自 OS 的终端。然后在 Idea 中转到文件 -> 设置 -> 构建工具 -> maven。我使用从 apache 下载的 maven(默认情况下 Idea 使用捆绑的 maven)。然后重新启动 Idea,然后再次 运行 mvn clean install
。还要确保你有正确的 Path, MAVEN_HOME, JAVA_HOME 环境变量。
这个单行我也看到了,但是不行
<maven.compiler.release>11</maven.compiler.release>
我制作了一些快速入门项目,我在其他项目中重复使用了这些项目,请随时查看:
这可能不是完全相同的错误,但我遇到了类似的错误。
检查 Maven Java 版本
因为 Maven 也 运行nig Java,请先检查您的 Maven 运行正在使用哪个版本:
mvn --version | grep -i java
它returns:
Java version 1.8.0_151, vendor: Oracle Corporation, runtime: C:\tools\jdk\openjdk1.8
版本不兼容
这里上面我的maven是运行Java Version 1.8.0_151
。
所以即使我指定 maven 编译 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>
逻辑上会打印出这个错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project efa-example-commons-task: Fatal error compiling: invalid target release: 11 -> [Help 1]
如何将特定 java 版本设置为 Maven
合乎逻辑的做法是为 Maven 设置更高的 Java 版本(例如 Java 版本 11 而不是 1.8)。
Maven 使用环境变量 JAVA_HOME
找到 Java 到 运行 的版本。因此,将此变量更改为您要编译的 JDK(例如 OpenJDK 11)。
完整性检查
然后 运行 再次 mvn --version
以确保配置已完成:
mvn --version | grep -i java
产量
Java version: 11.0.2, vendor: Oracle Corporation, runtime: C:\tools\jdk\openjdk11
编译使用 Java 11 规范编写的代码哪个更好更正确。
好吧,对我来说什么都没用。
我正在使用 spring 引导 和 休眠。 spring 引导版本是 ~2.0.1,我会在编译时不断收到此错误和空指针异常。问题出在需要升级版本的 hibernate 上。但在那之后我遇到了一些其他问题,这些问题似乎无法识别注释处理器,所以我决定将 spring 从 2.0.1 升级到 2.1.7 版本,一切都按预期工作。
你还需要添加上面的插件tough
希望对您有所帮助!
如果您使用的是 spring 引导,则在 pom.xml 中添加这些标签。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
和
<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>
您也可以在 <maven.compiler.release>
标签中将 java 版本更改为 11 或 13。
只需在 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>
您可以将 11 更改为 10、13 以及更改 java 版本。我正在使用最新的 java 13。它对我有用。
在我的例子中,虽然终端显示 Java 11,但我不得不在我的脚本中明确地将 JAVA_HOME 设置为 JDK-11版本。
这是因为,我正在通过 shell 脚本执行 mvn
,并且 mvn
使用我机器的默认值 JDK,即 JDK8 .
我确认 mvn
在脚本中使用哪个 JDK 版本并设置为 JDK-11,如下所示:
#!/bin/bash
echo $(java -version)
echo $(mvn --version | grep -i java )
export JAVA_HOME="/opt/jdk11/"
export PATH=$JAVA_HOME/bin:$PATH
echo $(java -version)
echo $(mvn --version | grep -i java )
如果其他方法均无效,甚至在将 JAVA_HOME 设置为 正确的 路径后,请检查 JAVA_HOME 路径中是否没有覆盖 <user>/.mavenrc
!
就我而言,
- "echo $JAVA_HOME" 显示版本 11
- "java -version" 显示版本 11
- 但是,“mvn -version”显示“Java version”不是 11
我将其粘贴到 .bash_profile 的顶部并获取它。有效。
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
alias java8='export JAVA_HOME=$JAVA_8_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
alias java11='export JAVA_HOME=$JAVA_11_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
java11