ไม่สามารถรวบรวมโปรเจ็กต์ Java 10 / Java 11 อย่างง่ายด้วย Maven


134

ฉันมีโครงการ 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ข้อผิดพลาดข้างต้นได้แล้ว
Naman

คำตอบ:


165

ในฐานะของ 30Jul 2018 เพื่อแก้ไขปัญหาดังกล่าวข้างต้นหนึ่งสามารถกำหนดค่ารุ่น JAVA ที่ใช้ใน Maven ขึ้นใด ๆ ที่จะ 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 ได้เช่นกัน

รายละเอียดเพิ่มเติมและตัวอย่างการกำหนดค่าในวิธีการรวบรวมและดำเนินการคุณลักษณะแสดงตัวอย่าง JDK กับ Maven


6
สิ่งนี้ใช้ได้เฉพาะเมื่อรัน maven ด้วย Java 11 หากเวอร์ชัน Java ของแพลตฟอร์มของคุณเป็นเช่น Java 8 (ดังนั้น maven จึงทำงานด้วย Java 8) คุณต้องกำหนด toolchain maven.apache.org/guides/mini /guide-using-toolchains.html
Franz Deschler

8
โปรดทราบว่าคุณสมบัติที่เกี่ยวข้องคือmaven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire

@ OlivierGrégoire - ดังนั้นเราสามารถแทนที่รหัสนี้ด้วยรหัสที่คุณให้? <properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties>
MasterJoe

1
@ MasterJoe2 ใช่คุณควรจะทำได้เนื่องจากคุณกำลังอัพเกรดเป็น Java-11
Naman

136

UPDATE

คำตอบคือล้าสมัยแล้ว ดูคำตอบนี้


maven-compiler-pluginขึ้นอยู่กับ ASM เวอร์ชันเก่าซึ่งยังไม่รองรับ Java 10 (และ Java 11) อย่างไรก็ตามสามารถระบุเวอร์ชันที่ถูกต้องของ 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


คุณจะพิจารณาเปลี่ยนคำตอบที่ยอมรับเป็นคำตอบที่เสนอไว้ในตอนต้นของโพสต์หรือไม่
leopal

24

การเพิ่ม maven-compiler-plugin ของคุณเป็น 3.8.0 ดูเหมือนจะจำเป็น แต่ก็ไม่เพียงพอ หากคุณยังคงประสบปัญหาคุณควรตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อม JAVA_HOME ของคุณตั้งค่าเป็น Java 10 (หรือ 11) หากคุณกำลังเรียกใช้จากบรรทัดคำสั่ง (ข้อความแสดงข้อผิดพลาดที่คุณได้รับจะไม่บอกสิ่งนี้) หรือหากคุณใช้งานจาก IDE คุณต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่าให้รัน maven ด้วย JDK ปัจจุบันของคุณ


14

อาจไม่ใช่ข้อผิดพลาดเดียวกัน แต่ฉันมีข้อผิดพลาดที่คล้ายกัน

ตรวจสอบเวอร์ชัน Maven Java

เนื่องจาก Maven รันด้วย Java ด้วยให้ตรวจสอบก่อนว่า Maven ของคุณใช้งานเวอร์ชันใด:

mvn --version | grep -i java 

ผลตอบแทน:

Java เวอร์ชัน 1.8.0_151 ผู้จำหน่าย: Oracle Corporation รันไทม์: 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>

มันจะพิมพ์ข้อผิดพลาดนี้อย่างมีเหตุผล:

[ข้อผิดพลาด] ล้มเหลวในการดำเนินการเป้าหมาย org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: คอมไพล์ (คอมไพเลอร์เริ่มต้น) บนโปรเจ็กต์ efa-example-commons-task: การคอมไพล์ข้อผิดพลาดร้ายแรง: การรีลีสเป้าหมายที่ไม่ถูกต้อง: 11 -> [ช่วยเหลือ 1]

วิธีตั้งค่าเวอร์ชัน java เฉพาะเป็น Maven

สิ่งที่ต้องทำคือตั้ง Java Version ที่สูงขึ้นเป็น Maven (เช่น Java เวอร์ชัน 11 แทน 1.8)

Maven ใช้ประโยชน์จากตัวแปรสภาพแวดล้อมJAVA_HOMEเพื่อค้นหา Java Version ที่จะรัน ดังนั้นเปลี่ยนตัวแปรนี้เป็น JDK ที่คุณต้องการคอมไพล์ (เช่น OpenJDK 11)

ตรวจสอบความถูกต้อง

จากนั้นเรียกใช้อีกครั้งmvn --versionเพื่อให้แน่ใจว่าการกำหนดค่าได้รับการดูแล:

mvn --version | grep -i java

อัตราผลตอบแทน

เวอร์ชัน Java: 11.0.2 ผู้จำหน่าย: Oracle Corporation รันไทม์: C: \ tools \ jdk \ openjdk11

ซึ่งดีกว่าและถูกต้องมากในการคอมไพล์โค้ดที่เขียนด้วยข้อกำหนด Java 11


1
สิ่งนี้ใช้ได้ผลสำหรับฉันเช่นกันเมื่อใช้ maven-assembly-plugin เวอร์ชัน 3.2.0
Gérard Binkhorst

13

ระบุ maven.compiler.source และเวอร์ชันเป้าหมาย

1) เวอร์ชัน Maven ที่รองรับ jdk ที่คุณใช้ ในกรณีของฉัน 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 ไปที่ไฟล์ -> settings -> build tools -> maven ฉันทำงานกับ maven ที่ดาวน์โหลดจาก apache (โดยค่าเริ่มต้น Idea ใช้มาเวนที่แถมมา) รีสตาร์ท Idea จากนั้นเรียกใช้mvn clean installอีกครั้ง ตรวจสอบให้แน่ใจว่าคุณมีตัวแปรสภาพแวดล้อมPath , MAVEN_HOME , JAVA_HOME ที่ถูกต้อง

ฉันยังเห็นซับเดียวนี้ แต่มันใช้ไม่ได้

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

ฉันทำโปรเจ็กต์เริ่มต้นอย่างรวดเร็วซึ่งฉันใช้ซ้ำในโปรเจ็กต์อื่น ๆ ของฉันโปรดตรวจสอบ:


2

หากคุณใช้สปริงบูตให้เพิ่มแท็กเหล่านี้ใน 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>

คุณสามารถเปลี่ยนเวอร์ชัน java เป็น 11 หรือ 13 ได้เช่นกันใน<maven.compiler.release>แท็ก

เพียงเพิ่มแท็กด้านล่างใน 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 13 ซึ่งเป็นรุ่นล่าสุด มันใช้ได้กับฉัน


0

เอาล่ะสำหรับฉันไม่มีอะไรได้ผล
ฉันใช้สปริงบูตกับโหมดไฮเบอร์เนต เวอร์ชัน spring boot คือ ~ 2.0.1 และฉันจะยังคงได้รับข้อผิดพลาดนี้และข้อยกเว้นของตัวชี้ null เมื่อทำการคอมไพล์ ปัญหาเกิดจากโหมดไฮเบอร์เนตที่จำเป็นต้องมีการชนเวอร์ชัน แต่หลังจากนั้นฉันมีปัญหาอื่น ๆ ที่ดูเหมือนว่าไม่รู้จักตัวประมวลผลคำอธิบายประกอบดังนั้นฉันจึงตัดสินใจที่จะกระแทกสปริงจาก 2.0.1 เป็น 2.1.7 และทุกอย่างก็ทำงานตามที่คาดไว้

คุณยังต้องเพิ่มปลั๊กอินด้านบน
หวังว่าจะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.