无法用 Maven 编译简单的 Java10/Java11项目

我有一个微不足道的 Maven 项目:

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

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

有办法解决吗?

283068 次浏览

更新

答案现在已经过时了。参见 这个答案


maven-compiler-plugin依赖于还不支持 Java10(和 Java11)的旧版 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之前的任何版本,并使用 翻译: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对:指定一个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。发布说明。


编辑[30.12.2018]

实际上,在编译针对 JDK/12的代码时,您也可以使用相同版本的 maven-compiler-plugin

关于如何使用 使用 Maven 编译并执行 JDK 预览特性的更多细节和示例配置。

把你的 maven-compiler-plugin提高到 3.8.0似乎是必要的,但是还不够。如果你仍然有问题,你也应该确保你的 JAVA_HOME环境变量设置为 Java 10(或11) ,如果你从命令行运行。(您得到的错误消息不会告诉您这一点。)或者,如果您从 IDE 运行,则需要确保将 IDE 设置为使用当前 JDK 运行 maven。

指定 maven.comper.source 和 target 版本。

1) Maven 版本,支持你使用的 JDK。

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 的想法,我更喜欢使用终端,而不是使用来自操作系统的终端。然后在 Ideas 中转到 file-> sets-> build tools-> maven。我使用的是从 apache 下载的 maven (默认情况下,Ideas 使用的是捆绑的 maven)。然后重新启动想法,再次运行 mvn clean install。还要确保有正确的 路径MAVEN _ HomeJAVA _ Home环境变量。

我也看到了这个笑话,但它不工作。

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

我做了一些快速入门的项目,我在其他项目中重复使用,可以随意检查:

这可能不完全是同一个错误,但我有一个类似的。

检查 MavenJava 版本

因为 Maven 也是用 Java 运行的,所以首先要检查 Maven 运行的是哪个版本:

mvn --version | grep -i java

它返回:

Java 版本1.8.0 _ 151,供应商: Oracle 公司,运行时: C: tools jdk openjdk1.8

不兼容的版本

这里我的专家正在使用 Java Version 1.8.0_151运行。 因此,即使我指定用 Java 11编译 maven:

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

它会从逻辑上打印出这个错误:

未能完成目标 Plugins: maven- 编译器-插件: 3.8.0: 编译 (默认-编译)项目 efa-example-commons-task: 致命错误 编译: 无效的目标版本: 11-> [ Help 1]

如何将特定的 java 版本设置为 Maven

合乎逻辑的做法是将更高级的 Java 版本设置为 Maven (例如,将 Java 版本11改为1.8)。

Maven 利用环境变量 JAVA_HOME找到要运行的 Java 版本。因此,将这个变量更改为您想要编译的 JDK (例如 OpenJDK11)。

理智检查

然后再次运行 mvn --version,以确保配置已得到处理:

mvn --version | grep -i java

产量

Java 版本: 11.0.2,供应商: 甲骨文公司,运行时: c: 工具 jdk openjdk11

这对于编译用 Java11规范编写的代码来说更好更正确。

好吧,对我来说什么都没用。
我正在使用春季启动 冬眠。春季启动版本是 ~ 2.0.1,我会在编译时继续得到这个错误和空指针异常。问题在于需要升级版本的 Hibernate。但是在那之后,我遇到了一些其他的问题,似乎注释处理器没有被识别出来,所以我决定将 Spring 从2.0.1版本提升到2.1.7版本,一切都按照预期运行。

您仍然需要添加上述插件的艰难
希望能有帮助!

如果您使用的是 spring boot,那么在 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 _ Home设置为 JDK-11,尽管终端显示的是 Java11版本。

这是因为,我通过 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 设置为 正确路径之后,检查是否没有覆盖 <user>/.mavenrc中的 JAVA _ HOME 路径!

对我来说,

  • “ echo $JAVA _ HOME”显示版本11
  • “ java-version”显示版本11
  • 然而,「 mvn-version 」显示「 Java 版本」不是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


mvn可能使用 JAVA_HOME,但是如果设置它不起作用,那么在实际的 mvn 脚本中可能会重写

例如,在我的系统(mac)上,mvn 指向 /usr/local/bin/mvn 它实际上指向 /usr/local/Cellar/maven/3.8.6/bin/mvn,这是一个指向 /usr/local/Cellar/maven/3.8.6/libexec/bin/mvn的 bash 脚本,这个脚本在顶部读起来是这样的:

if [ -z "$MAVEN_SKIP_RC" ] ; then


if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi


if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi


if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi


fi

所以它显示它在三个不同的地方寻找 env,除非 MAVEN_SKIP_RC被设置。

如果我运行 MAVEN_SKIP_RC=1 mvn -version,现在将考虑 JAVA _ HOME。

但真正的解决办法是在 mavenrc 文件中找到罪魁祸首

在我的案例中,唯一存在的文件是 /etc/mavenrc,它写道:

JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

因此,它将 JAVA 1.8设置为默认值,覆盖了原始的 JAVA _ HOME。

把它改成 -v11就能正常工作了。 或者干脆删除/etc/mavenrc,将默认值恢复为 JAVA _ HOME 值。