【问题标题】:Unable to compile simple Java 10 / Java 11 project with Maven无法使用 Maven 编译简单的 Java 10 / Java 11 项目
【发布时间】:2018-08-30 03:12:47
【问题描述】:

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

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

【问题讨论】:

标签: java maven java-10 java-11 module-info


【解决方案1】:

截至 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。 -- release notes.


编辑 [30.12.2018]

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

更多详细信息和如何Compile and execute a JDK preview feature with Maven的示例配置。

【讨论】:

  • 这仅在使用 Java 11 执行 maven 时开箱即用。如果您的平台 Java 版本是例如Java 8(所以maven是用Java 8执行的),需要定义一个工具链maven.apache.org/guides/mini/guide-using-toolchains.html
  • 注意关联的属性是maven.compiler.release:&lt;properties&gt;&lt;maven.compiler.release&gt;11&lt;/maven.compiler.release&gt;&lt;/properties&gt;
  • @OlivierGrégoire - 那么,我们可以用您提供的代码替换此代码吗? 1.81.8
  • @MasterJoe2 是的,你应该能够做到这一点,因为你正在升级到 Java-11。
  • 明确一点:运行maven的Java版本必须等于或高于发布目标版本和源目标版本。
【解决方案2】:

更新

答案现在已经过时了。见this answer


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

【讨论】:

    【解决方案3】:

    这可能不是完全相同的错误,但我遇到了类似的错误。

    检查 Maven Java 版本

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

    mvn --version | grep -i java 
    

    返回:

    Java 版本 1.8.0_151,供应商:Oracle 公司,运行时: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] 未能执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile 项目 efa-example-commons-task 上的(默认编译):致命错误 编译:无效的目标版本: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 规范编写的代码更好更正确。

    【讨论】:

    • 这对我有用,在使用 maven-assembly-plugin 版本 3.2.0 时也是如此
    【解决方案4】:

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

    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 中,我更喜欢使用终端而不是使用操作系统中的终端。然后在 Idea 中转到文件 -> 设置 -> 构建工具 -> maven。我使用从 apache 下载的 maven(默认情况下,Idea 使用捆绑的 maven)。然后重新启动 Idea 并再次运行 mvn clean install。还要确保您有正确的 PathMAVEN_HOMEJAVA_HOME 环境变量。

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果您使用的是 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>
        

        您也可以在&lt;maven.compiler.release&gt; 标签中将 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。它对我有用。

        【讨论】:

          【解决方案7】:

          好吧,所以对我来说没有任何效果。
          我正在使用 Spring Boot with 休眠。 Spring Boot 版本是 ~2.0.1,我会在编译时不断收到此错误和空指针异常。问题在于需要版本提升的休眠。但在那之后,我遇到了一些其他问题,似乎无法识别注释处理器,所以我决定将 spring 从 2.0.1 升级到 2.1.7 版本,一切都按预期工作。

          上面的插件还需要加一下
          希望对您有所帮助!

          【讨论】:

            【解决方案8】:

            就我而言,尽管终端显示 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 )
            

            【讨论】:

              【解决方案9】:

              如果没有其他方法,即使您将 JAVA_HOME 设置为 正确 路径,请检查 &lt;user&gt;/.mavenrc 中是否没有覆盖 JAVA_HOME 路径!

              【讨论】:

                猜你喜欢
                • 2021-07-23
                • 1970-01-01
                • 2021-06-30
                • 2014-08-18
                • 2020-11-19
                • 2014-07-17
                • 2015-06-02
                • 1970-01-01
                相关资源
                最近更新 更多