Неможливо скласти простий проект Java 10 / Java 11 з Maven


134

У мене є тривіальний проект Мейвена:

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для виправлення вищевказаної помилки .
Наман

Відповіді:


163

З 30 липня 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), вам потрібно визначити ланцюжок
Франц

8
Зауважте, що пов’язане майно maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Олів'є

@ 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.
Наман

136

ОНОВЛЕННЯ

Відповідь зараз застаріла. Дивіться цю відповідь .


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


Чи могли б ви змінити прийняту відповідь на ту, запропоновану на початку вашої публікації?
леопаль

24

Підвищити плагін Maven-компілятор до 3.8.0 здається необхідним, але недостатньо. Якщо у вас все ще виникають проблеми, ви також повинні переконатися, що ваша змінна середовища JAVA_HOME встановлена ​​на Java 10 (або 11), якщо ви працюєте з командного рядка. (Повідомлення про помилку, яке ви отримаєте, це вам не скаже.) Або якщо ви працюєте з IDE, вам потрібно переконатися, що він налаштований для запуску maven з вашим поточним JDK.


14

Це може бути не однакова помилка, але у мене була схожа.

Перевірте версію Java Maven

Оскільки 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-компілятор-плагін: 3.8.0: компілювати (компілювати за замовчуванням) для проекту efa-example-commons-task: Фатальна помилка компіляції: недійсний цільовий випуск: 11 -> [Довідка 1]

Як встановити конкретну версію Java для Maven

Логічно, що потрібно зробити, - це встановити вищу версію Java Maven (наприклад, 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.


1
Це працювало для мене, також, коли використовувався Maven-Assembly-плагін версії 3.2.0
Джерард Бінкхорст,

13

Вкажіть maven.compiler.source та цільові версії.

1) Maven версія, яка підтримує jdk, який ви використовуєте. У моєму випадку JDK 11 та maven 3.6.0.

2) пом.хмл

<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. Я працюю з Maven, який я завантажив з apache (за замовчуванням Idea використовує пакет Maven). Потім перезапустіть 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. Я використовую Java 13, яка є останньою. Це працює для мене.


0

Добре, тому для мене нічого не вийшло.
Я використовував весняний черевик зі сплячкою. Версія весняного завантаження становила ~ 2.0.1, і я би продовжував отримувати цю помилку та нульове виключення вказівника при компіляції. Проблема полягала в сплячому режимі, що потребував удару по версії. Але після цього у мене виникли інші проблеми, які, здавалося, процесор анотації не був розпізнаний, тож я вирішив просто зіткнути весну від 2.0.1 до 2.1.7-випуску, і все працювало так, як очікувалося.

Вам все одно потрібно додати вищевказаний плагін жорстко
Сподіваюся, що це допоможе!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.