Tidak dapat mengkompilasi proyek Java 10 / Java 11 sederhana dengan Maven

134

Saya punya proyek Maven yang sepele:

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>

Ketika saya membangun proyek melalui mvn -X install -DskipTests=true, gagal:

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

Apakah ada cara untuk memperbaikinya?

ZhekaKozlov
sumber
1
@MikhailKholodkov Bug telah diatasi dan sekarang orang dapat menggunakan maven-compiler-plugin:3.8.0untuk memperbaiki kesalahan di atas .
Naman

Jawaban:

162

Pada 30Jul, 2018 untuk memperbaiki masalah di atas, orang dapat mengkonfigurasi versi java yang digunakan dalam maven hingga JDK / 11 dan memanfaatkan maven-compiler-plugin:3.8.0untuk menentukan rilis baik 9,10,11 tanpa ketergantungan eksplisit .

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

Catatan : - Nilai default untuk sumber / target telah diangkat dari 1,5 ke 1,6 dengan versi ini. - catatan rilis.


Edit [30.12.2018]

Bahkan, Anda dapat menggunakan versi yang sama maven-compiler-pluginsaat mengkompilasi kode terhadap JDK / 12 juga.

Lebih detail dan konfigurasi sampel dalam cara Mengkompilasi dan menjalankan fitur pratinjau JDK dengan Maven .

Naman
sumber
6
Ini hanya bekerja di luar kotak ketika maven dieksekusi dengan Java 11. Jika platform Java versi Anda adalah Java 8 (dan juga maven dieksekusi dengan Java 8), Anda perlu mendefinisikan toolchain maven.apache.org/guides/mini /guide-using-toolchains.html
Franz Deschler
8
Perhatikan bahwa properti terkait adalah maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire
@ OlivierGrégoire - Jadi, kita dapat mengganti kode ini dengan yang Anda berikan? <properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties>
MasterJoe
1
@ MasterJoe2 Ya Anda harus bisa melakukan itu, mengingat Anda meningkatkan ke Java-11.
Naman
136

MEMPERBARUI

Jawabannya sekarang sudah usang. Lihat jawaban ini .


maven-compiler-plugintergantung pada versi ASM lama yang belum mendukung Java 10 (dan Java 11). Namun, dimungkinkan untuk secara eksplisit menentukan versi ASM yang tepat:

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

Anda dapat menemukan yang terbaru di https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav

ZhekaKozlov
sumber
Apakah Anda mempertimbangkan untuk mengubah jawaban yang diterima ke yang diusulkan di awal posting Anda?
leopal
24

Meningkatkan maven-compiler-plugin ke 3.8.0 tampaknya diperlukan tetapi tidak cukup. Jika Anda masih mengalami masalah, Anda juga harus memastikan variabel lingkungan JAVA_HOME Anda diatur ke Java 10 (atau 11) jika Anda menjalankan dari baris perintah. (Pesan kesalahan yang Anda dapatkan tidak akan memberi tahu Anda tentang hal ini.) Atau jika Anda menjalankan dari IDE, Anda perlu memastikannya diatur untuk menjalankan pakar dengan JDK Anda saat ini.

MiguelMunoz
sumber
14

Mungkin tidak persis kesalahan yang sama, tetapi saya memiliki kesalahan serupa.

Periksa Versi Java Maven

Karena Maven juga runnig dengan Java, periksa dulu versi Maven Anda yang sedang berjalan:

mvn --version | grep -i java 

Ia mengembalikan:

Versi Java 1.8.0_151, vendor: Oracle Corporation, runtime: C: \ tools \ jdk \ openjdk1.8

Versi tidak kompatibel

Di sini di atas saya berjalan pakar Java Version 1.8.0_151. Jadi, bahkan jika saya menentukan pakar untuk dikompilasi dengan 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>

Secara logis akan mencetak kesalahan ini:

[GALAT] Gagal menjalankan tujuan org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: kompilasi (default-compile) pada proyek efa-example-commons-task: Fatal error compiling: rilis target yang tidak valid: 11 -> [Bantuan 1]

Cara mengatur versi java tertentu ke Maven

Hal yang logis untuk dilakukan adalah mengatur Versi Java yang lebih tinggi ke Maven (mis. Versi Java 11 sebagai gantinya 1.8).

Maven memanfaatkan variabel lingkungan JAVA_HOMEuntuk menemukan Versi Java untuk dijalankan. Jadi ubah variabel ini ke JDK yang ingin Anda kompilasi (mis. OpenJDK 11).

Cek kewarasan

Kemudian jalankan lagi mvn --versionuntuk memastikan konfigurasi telah diurus:

mvn --version | grep -i java

hasil panen

Versi Java: 11.0.2, vendor: Oracle Corporation, runtime: C: \ tools \ jdk \ openjdk11

Yang jauh lebih baik dan benar untuk mengkompilasi kode yang ditulis dengan spesifikasi Java 11.

Pembuat Kunci00
sumber
1
Ini bekerja untuk saya, juga ketika menggunakan maven-assembly-plugin versi 3.2.0
Gérard Binkhorst
13

Tentukan versi maven.compiler.source dan target.

1) Versi Maven yang mendukung jdk yang Anda gunakan. Dalam kasus saya JDK 11 dan pakar 3.6.0.

2) pom.xml

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

Sebagai alternatif, Anda dapat sepenuhnya menentukan plugin compiler maven. Lihat jawaban sebelumnya. Ini lebih pendek dalam contoh saya :)

<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) membangun kembali proyek untuk menghindari kompilasi kesalahan dalam IDE Anda.

4) Jika masih tidak berhasil. Dalam Intellij Idea saya lebih suka menggunakan terminal daripada menggunakan terminal dari OS. Kemudian dalam Ide pergi ke file -> pengaturan -> alat membangun -> pakar. Saya bekerja dengan pakar yang saya unduh dari apache (secara default Ide menggunakan bundel pakar). Mulai ulang Ide lalu jalankan mvn clean installlagi. Pastikan juga Anda memiliki variabel lingkungan Path , MAVEN_HOME , JAVA_HOME yang benar .

Saya juga melihat ini satu-liner, tetapi tidak berhasil.

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

Saya membuat beberapa proyek starter cepat, yang saya gunakan kembali di proyek saya yang lain, silakan cek:

Yan Khonski
sumber
2

Jika Anda menggunakan spring boot maka tambahkan tag ini di pom.xml.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

dan

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

Anda dapat mengubah versi java menjadi 11 atau 13 juga dalam <maven.compiler.release>tag.

Cukup tambahkan tag di bawah ini di 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>

Anda dapat mengubah 11 menjadi 10, 13 juga untuk mengubah versi java. Saya menggunakan java 13 yang terbaru. Ini bekerja untuk saya.

Abhishek
sumber
0

Baiklah, bagi saya tidak ada yang berhasil.
Saya menggunakan spring boot dengan hibernate. Versi spring boot ~ 2.0.1 dan saya akan terus mendapatkan error dan null pointer exception saat dikompilasi. Masalahnya adalah dengan hibernate yang membutuhkan versi bump. Tapi setelah itu saya punya beberapa masalah lain yang sepertinya prosesor anotasi tidak dikenali jadi saya memutuskan untuk hanya menabrak pegas dari 2.0.1 ke 2.1.7-rilis dan semuanya bekerja seperti yang diharapkan.

Anda masih perlu menambahkan plugin tangguh di atas
Semoga membantu!

Tudor
sumber