Không thể biên dịch dự án Java 10 / Java 11 đơn giản với Maven


134

Tôi có một dự án Maven tầm thường:

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>

Khi tôi xây dựng dự án thông qua mvn -X install -DskipTests=true, nó thất bại:

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

Có cách nào để sửa lỗi này?


1
@MikhailKholodkov Lỗi đã được khắc phục và giờ đây người ta có thể sử dụng maven-compiler-plugin:3.8.0để sửa lỗi trên .
Naman

Câu trả lời:


162

Kể từ 30Jul, 2018 để khắc phục sự cố nêu trên, người ta có thể định cấu hình phiên bản java được sử dụng trong maven thành bất kỳ lên đến JDK / 11 và sử dụng maven-compiler-plugin:3.8.0để chỉ định một bản phát hành 9,10,11 mà không có bất kỳ phụ thuộc rõ ràng nào .

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

Lưu ý : - Giá trị mặc định cho nguồn / đích đã được nâng từ 1,5 lên 1,6 với phiên bản này. - ghi chú phát hành.


Chỉnh sửa [30.12.2018]

Trên thực tế, bạn cũng có thể sử dụng cùng một phiên bản maven-compiler-plugintrong khi biên dịch mã dựa trên JDK / 12.

Thêm chi tiết và cấu hình mẫu trong cách Biên dịch và thực thi tính năng xem trước JDK với Maven .


6
Điều này chỉ hoạt động ngoài hộp khi maven được thực thi với Java 11. Nếu phiên bản Java nền tảng của bạn là Java 8 (và do đó maven được thực thi với Java 8), bạn cần xác định một công cụ maven.apache.org/guides/mini /guide-USE-toolchains.html
Franz Deschler

8
Lưu ý rằng tài sản liên quan là maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire

@ OlivierGrégoire - Vì vậy, chúng tôi có thể thay thế mã này bằng mã bạn đã cung cấp? <property> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </ property>
MasterJoe

1
@ MasterJoe2 Có, bạn sẽ có thể làm điều đó, với điều kiện bạn đang nâng cấp lên Java-11.
Naman

136

CẬP NHẬT

Câu trả lời đã lỗi thời. Xem câu trả lời này .


maven-compiler-pluginphụ thuộc vào phiên bản cũ của ASM chưa hỗ trợ Java 10 (và Java 11). Tuy nhiên, có thể chỉ định rõ ràng phiên bản ASM phù hợp:

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

Bạn có thể tìm thấy thông tin mới nhất tại https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav


Bạn có cân nhắc việc thay đổi câu trả lời được chấp nhận cho câu trả lời được đề xuất ở đầu bài viết của bạn không?
ngày

24

Tăng cường trình biên dịch maven của bạn lên 3.8.0 dường như là cần thiết nhưng chưa đủ. Nếu bạn vẫn gặp sự cố, bạn cũng nên đảm bảo biến môi trường JAVA_HOME của bạn được đặt thành Java 10 (hoặc 11) nếu bạn đang chạy từ dòng lệnh. (Thông báo lỗi bạn nhận được sẽ không cho bạn biết điều này.) Hoặc nếu bạn đang chạy từ IDE, bạn cần đảm bảo rằng nó được thiết lập để chạy maven với JDK hiện tại của bạn.


14

Nó có thể không chính xác là cùng một lỗi, nhưng tôi đã có một lỗi tương tự.

Kiểm tra phiên bản Java Maven

Vì Maven cũng chạy với Java, trước tiên hãy kiểm tra xem Maven của bạn đang chạy phiên bản nào:

mvn --version | grep -i java 

Nó trở lại:

Phiên bản Java 1.8.0_151, nhà cung cấp: Tập đoàn Oracle, thời gian chạy: C: \ tools \ jdk \ openjdk1.8

Phiên bản không tương thích

Ở đây trên maven của tôi đang chạy với Java Version 1.8.0_151. Vì vậy, ngay cả khi tôi chỉ định maven để biên dịch với 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>

Nó sẽ in ra lỗi này một cách hợp lý:

[ERROR] Không thể thực hiện mục tiêu org.apache.maven.plugins: maven-Trình biên dịch-plugin: 3.8.0: biên dịch (mặc định biên dịch) trên dự án efa-example-commons-task: Biên dịch lỗi nghiêm trọng: phát hành mục tiêu không hợp lệ: 11 -> [Trợ giúp 1]

Cách đặt phiên bản java cụ thể thành Maven

Điều hợp lý cần làm là đặt Phiên bản Java cao hơn thành Maven (ví dụ: phiên bản Java 11 thay vì 1.8).

Maven sử dụng biến môi trường JAVA_HOMEđể tìm Phiên bản Java để chạy. Vì vậy, thay đổi biến này thành JDK mà bạn muốn biên dịch lại (ví dụ OpenJDK 11).

Kiểm tra sự tỉnh táo

Sau đó chạy lại mvn --versionđể đảm bảo cấu hình đã được chăm sóc:

mvn --version | grep -i java

sản lượng

Phiên bản Java: 11.0.2, nhà cung cấp: Tập đoàn Oracle, thời gian chạy: C: \ tools \ jdk \ openjdk11

Điều này tốt hơn và chính xác hơn để biên dịch mã được viết bằng các đặc tả Java 11.


1
Điều này cũng hiệu quả với tôi, khi sử dụng maven-assembly-plugin phiên bản 3.2.0
Gérard Binkhorst

13

Chỉ định maven.compiler.source và các phiên bản đích.

1) Phiên bản Maven hỗ trợ jdk bạn sử dụng. Trong trường hợp của tôi, JDK 11 và maven 3.6.0.

2) pom.xml

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

Thay thế, bạn hoàn toàn có thể chỉ định plugin trình biên dịch maven. Xem câu trả lời trước. Nó ngắn hơn trong ví dụ của tôi :)

<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) xây dựng lại dự án để tránh các lỗi biên dịch trong IDE của bạn.

4) Nếu nó vẫn không hoạt động. Trong Intellij Idea tôi thích sử dụng terminal hơn là sử dụng terminal từ OS. Sau đó, trong ý tưởng, hãy chuyển đến tệp -> cài đặt -> công cụ xây dựng -> maven. Tôi làm việc với maven tôi đã tải xuống từ apache (theo mặc định Idea sử dụng maven đi kèm). Khởi động lại ý tưởng sau đó và chạy mvn clean installlại. Đồng thời đảm bảo rằng bạn có các biến môi trường Path , MAVEN_HOME , JAVA_HOME chính xác .

Tôi cũng đã thấy một lớp lót này, nhưng nó không hoạt động.

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

Tôi đã thực hiện một số dự án khởi động nhanh, mà tôi sử dụng lại trong các dự án khác của mình, vui lòng kiểm tra:


2

Nếu bạn đang sử dụng spring boot thì hãy thêm các thẻ này vào 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>

Bạn có thể thay đổi phiên bản java thành 11 hoặc 13 trong <maven.compiler.release>thẻ.

Chỉ cần thêm các thẻ bên dưới trong 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>

Bạn cũng có thể thay đổi 11 thành 10, 13 để thay đổi phiên bản java. Tôi đang sử dụng java 13 mới nhất. Nó làm việc cho tôi.


0

Được rồi vì vậy đối với tôi không có gì làm việc.
Tôi đã sử dụng boot mùa xuân với ngủ đông. Phiên bản khởi động mùa xuân là ~ 2.0.1 và tôi sẽ tiếp tục gặp lỗi này và ngoại lệ con trỏ null khi biên dịch. Vấn đề là với ngủ đông cần một phiên bản vết sưng. Nhưng sau đó, tôi đã gặp một số vấn đề khác có vẻ như bộ xử lý chú thích không được nhận ra nên tôi quyết định chỉ tung ra phiên bản 2.0.1 đến 2.1.7 và mọi thứ hoạt động như mong đợi.

Bạn vẫn cần thêm các plugin khó khăn ở trên
Hy vọng nó sẽ giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.