无法使用Maven编译简单的Java 10 / Java 11项目


133

我有一个琐碎的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

有没有办法解决这个问题?


1
@MikhailKholodkov该错误已解决,现在可以利用maven-compiler-plugin:3.8.0修复上述错误
纳曼

Answers:


161

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

注意:-使用此版本,源/目标的默认值已从1.5提升到1.6。-发布说明。


编辑[30.12.2018]

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

有关如何使用Maven编译和执行JDK预览功能的更多详细信息和示例配置。


6
仅当使用Java 11执行maven时,此功能才可用。如果您的平台Java版本是Java 8(因此,使用Java 8执行maven),则需要定义工具链maven.apache.org/guides/mini /guide-using-toolchains.html
Franz Deschler,

8
请注意,相关的属性是maven.compiler.release<properties><maven.compiler.release>11</maven.compiler.release></properties>
OlivierGrégoire'19

@OlivierGrégoire-因此,我们可以将这段代码替换为您提供的代码吗?<properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </ properties>
MasterJoe2

1
@ MasterJoe2是的,考虑到要升级到Java-11,您应该能够做到。
纳曼

136

更新

现在答案已经过时了。看到这个答案


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中找到最新的


您是否考虑将可接受的答案更改为帖子开头建议的答案?

24

将您的maven-compiler-plugin升级到3.8.0似乎是必要的,但还不够。如果仍然有问题,并且还从命令行运行,还应确保将JAVA_HOME环境变量设置为Java 10(或11)。(收到的错误消息不会告诉您。)或者,如果您正在从IDE中运行,则需要确保将其设置为使用当前JDK运行maven。


14

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

检查Maven Java版本

由于Maven也可以用Java运行,因此请首先检查您的Maven运行在哪个版本上:

mvn --version | grep -i java 

它返回:

Java版本1.8.0_151,供应商:Oracle Corporation,运行时:C:\ tools \ jdk \ openjdk1.8

不兼容的版本

在上面,我的行家正在使用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>

它将在逻辑上打印出此错误:

[错误]无法在项目efa-example-commons-task上执行目标org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile(默认编译):致命错误编译:无效的目标版本:11 -> [帮助1]

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

合理的做法是为Maven设置更高的Java版本(例如Java版本11代替1.8)。

Maven利用环境变量JAVA_HOME来查找要运行的Java版本。因此,将此变量更改为您要编译的JDK(例如OpenJDK 11)。

完整性检查

然后再次运行mvn --version以确保已完成配置:

mvn --version | grep -i java

产量

Java版本:11.0.2,供应商:Oracle Corporation,运行时:C:\ tools \ jdk \ openjdk11

编译使用Java 11规范编写的代码会更好,更正确。


1
使用maven-组装插件版本3.2.0时,这为我工作,也
热拉尔Binkhorst

12

指定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再次运行。还要确保您具有正确的PathMAVEN_HOMEJAVA_HOME环境变量。

我也看到了这种单线,但它不起作用。

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

我做了一些快速入门项目,并在其他项目中重复使用了这些项目,请随时检查:


2

如果您使用的是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。这个对我有用。


0

好吧,对我而言,没有任何作用。
我在使用Spring Boot Hibernate。春季启动版本是〜2.0.1,在编译时我会不断收到此错误和空指针异常。休眠的问题在于需要版本升级。但是在那之后,我又遇到了其他一些问题,好像注释处理器无法识别,因此我决定将弹簧从2.0.1发行版升级到2.1.7版本,一切都按预期进行。

您仍然需要添加上述插件
,以帮助您!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.