Nie można skompilować prostego projektu Java 10 / Java 11 za pomocą Maven

140

Mam trywialny projekt Mavena:

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>

Kiedy buduję projekt za pomocą mvn -X install -DskipTests=true, kończy się niepowodzeniem:

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

Czy jest sposób, aby to naprawić?

ZhekaKozlov
źródło
1
@MikhailKholodkov Błąd został rozwiązany i można teraz skorzystać z, maven-compiler-plugin:3.8.0aby naprawić powyższy błąd .
Naman

Odpowiedzi:

186

Od 30 lipca 2018 r., Aby rozwiązać powyższy problem, można skonfigurować wersję java używaną w maven do dowolnej wersji do JDK / 11 i użyć maven-compiler-plugin:3.8.0do określenia wersji 9,10,11 bez żadnych wyraźnych zależności .

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

Uwaga : - W tej wersji domyślna wartość źródła / celu została podniesiona z 1,5 do 1,6. - informacje o wersji.


Edytuj [30.12.2018]

W rzeczywistości możesz skorzystać z tej samej wersji programu maven-compiler-pluginpodczas kompilowania kodu z JDK / 12.

Więcej szczegółów i przykładowa konfiguracja w sposobie kompilowania i wykonywania funkcji podglądu JDK za pomocą Maven .

Naman
źródło
6
Działa to tylko po wyjęciu z pudełka, gdy maven jest uruchamiany z Javą 11. Jeśli wersja Java Twojej platformy to np. Java 8 (a więc maven jest uruchamiany z Javą 8), musisz zdefiniować łańcuch
Franz Deschler,
8
Należy pamiętać, że powiązana nieruchomość to maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Olivier Grégoire
@ OlivierGrégoire - Czy możemy zastąpić ten kod tym, który podałeś? <properties> <maven.compiler.target> 1,8 </maven.compiler.target> <maven.compiler.source> 1,8 </maven.compiler.source> </properties>
MasterJoe
1
@ MasterJoe2 Tak, powinieneś być w stanie to zrobić, biorąc pod uwagę, że dokonujesz aktualizacji do Java-11.
Naman
136

AKTUALIZACJA

Odpowiedź jest już nieaktualna. Zobacz tę odpowiedź .


maven-compiler-pluginzależy od starej wersji ASM, która jeszcze nie obsługuje Java 10 (i Java 11). Istnieje jednak możliwość jednoznacznego określenia właściwej wersji 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>

Najnowsze można znaleźć na https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav

ZhekaKozlov
źródło
Czy rozważyłbyś zmianę zaakceptowanej odpowiedzi na zaproponowaną na początku Twojego posta?
leopal
25

Zwiększenie wtyczki maven-compiler-plugin do 3.8.0 wydaje się być konieczne, ale niewystarczające. Jeśli nadal masz problemy, upewnij się, że zmienna środowiskowa JAVA_HOME jest ustawiona na Java 10 (lub 11), jeśli korzystasz z wiersza poleceń. (Komunikat o błędzie, który otrzymasz, nie powie Ci tego.) Lub jeśli korzystasz z IDE, musisz upewnić się, że jest ustawiony na uruchamianie maven z Twoim aktualnym JDK.

MiguelMunoz
źródło
18

Może to nie jest dokładnie ten sam błąd, ale miałem podobny.

Sprawdź wersję Maven Java

Ponieważ Maven działa również z Javą, sprawdź najpierw, na której wersji działa Twój Maven:

mvn --version | grep -i java 

Zwraca:

Wersja Java 1.8.0_151, dostawca: Oracle Corporation, środowisko wykonawcze: C: \ tools \ jdk \ openjdk1.8

Niezgodna wersja

Tutaj nad moim biegiem biegnie Java Version 1.8.0_151. Więc nawet jeśli określę maven do kompilacji z 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>

Logicznie wydrukuje ten błąd:

[BŁĄD] Nie udało się wykonać celu org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: compile (default-compile) w projekcie efa-example-commons-task: krytyczny błąd kompilacji: niepoprawne docelowe wydanie: 11 -> [Pomoc 1]

Jak ustawić określoną wersję Java na Maven

Logiczną rzeczą jest ustawienie wyższej wersji Java na Maven (np. Java w wersji 11 zamiast 1.8).

Maven korzysta ze zmiennej środowiskowej, JAVA_HOMEaby znaleźć wersję Java do uruchomienia. Więc zmień tę zmienną na JDK, dla którego chcesz kompilować (np. OpenJDK 11).

Kontrola poczytalności

Następnie uruchom ponownie, mvn --versionaby upewnić się, że konfiguracja została wykonana:

mvn --version | grep -i java

plony

Wersja Java: 11.0.2, producent: Oracle Corporation, środowisko wykonawcze: C: \ tools \ jdk \ openjdk11

Co jest znacznie lepsze i poprawne w kompilacji kodu napisanego zgodnie ze specyfikacjami Java 11.

KeyMaker00
źródło
1
To zadziałało dla mnie, również podczas używania wtyczki maven-assembly-plugin w wersji 3.2.0
Gérard Binkhorst
17

Określ wersje źródłowe i docelowe maven.compiler.source.

1) Wersja Mavena obsługująca używany jdk. W moim przypadku JDK 11 i maven 3.6.0.

2) pom.xml

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

Alternatywnie możesz w pełni określić wtyczkę kompilatora maven. Zobacz poprzednie odpowiedzi. W moim przykładzie jest krótszy :)

<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) przebuduj projekt, aby uniknąć błędów kompilacji w IDE.

4) Jeśli nadal nie działa. W Intellij Idea wolę używać terminala zamiast używać terminala z systemu operacyjnego. Następnie w Idea przejdź do pliku -> ustawienia -> narzędzia do budowania -> maven. Współpracuję z mavenem pobranym z apache (domyślnie Idea używa dołączonego mavena). Następnie uruchom ponownie Idea i uruchom mvn clean installponownie. Upewnij się również, że masz poprawną ścieżkę , MAVEN_HOME , JAVA_HOME zmienne środowiskowe .

Widziałem też ten jednoliniowiec, ale nie działa.

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

Zrobiłem kilka szybkich projektów, które wykorzystuję ponownie w innych moich projektach, zapraszam do sprawdzenia:

Yan Khonski
źródło
2

Jeśli używasz rozruchu sprężynowego, dodaj te tagi w pom.xml.

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

i

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

Możesz zmienić wersję java na 11 lub 13, a także w <maven.compiler.release>tagu.

Po prostu dodaj poniższe tagi w 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>

Możesz zmienić 11 na 10, 13, a także zmienić wersję java. Używam najnowszej wersji Java 13. Mi to pasuje.

Abhishek
źródło
0

W porządku, więc dla mnie nic nie działało.
Używałem butów sprężynowych z hibernacją. Wersja Spring Boot to ~ 2.0.1 i po kompilacji otrzymywałbym ten błąd i wyjątek zerowego wskaźnika. Problem dotyczył hibernacji, która wymagała zmiany wersji. Ale potem miałem kilka innych problemów, które wyglądały na to, że procesor adnotacji nie został rozpoznany, więc zdecydowałem się po prostu przesunąć sprężynę z wersji 2.0.1 na 2.1.7 i wszystko działało zgodnie z oczekiwaniami.

Nadal musisz dodać powyższą wtyczkę.
Mam nadzieję, że to pomoże!

Tudor
źródło