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

У меня есть тривиальный проект 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

ОБНОВИТЬ

Ответ сейчас устарел. Смотрите этот ответ.


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

Ответ 2

В качестве альтернативы, по состоянию на 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.

Подробнее и пример конфигурации, как скомпилировать функцию предварительного просмотра JDK12 с Maven.

Ответ 3

Усиление вашего maven-compiler-plugin до 3.8.0 кажется необходимым, но недостаточно. Если у вас все еще есть проблемы, вы также должны убедиться, что переменная среды JAVA_HOME установлена на Java 10 (или 11), если вы работаете из командной строки. (Сообщение об ошибке, которое вы получите, не скажет вам об этом.) Или, если вы работаете с IDE, вам нужно убедиться, что он настроен на запуск maven с вашим текущим JDK.

Ответ 4

Возможно, это не та же ошибка, но у меня была похожая.

Проверьте Maven Java версии

Поскольку Maven также работает с Java, сначала проверьте, на какой версии работает ваш Maven:

mvn --version | grep -i java 

Возвращает:

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

Несовместимая версия

Здесь выше мой мавен бежит с 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: компилировать (default-compile) для проекта efa-example-commons-task: Неустранимая ошибка компиляция: неверный целевой выпуск: 11 → [Help1]

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

Логическая вещь, которую нужно сделать, это установить более высокую версию Java в Maven (например, Java версия 11 вместо 1.8).

Maven использует переменную среды JAVA_HOME, чтобы найти версию Java для запуска. Поэтому измените эту переменную на JDK, с которым вы хотите скомпилировать (например, OpenJDK 11).

Проверка работоспособности

Затем снова запустите mvn --version, чтобы убедиться, что с конфигурацией позаботились:

mvn --version | grep -i java

дает

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

Что гораздо лучше и правильнее для компиляции кода, написанного со спецификациями Java 11.

Ответ 5

Укажите 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 я предпочитаю использовать терминал вместо терминала из ОС. Затем в Idea зайдите в файл → настройки → инструменты сборки → maven. Я работаю с Maven, который я скачал с Apache (по умолчанию Idea использует пакетный Maven). Затем перезапустите Idea и снова запустите mvn clean install. Также убедитесь, что у вас есть правильные переменные окружения Path, MAVEN_HOME, JAVA_HOME.

Я тоже видел эту однострочную, но она не работает.

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

Ответ 6

Хорошо, так что для меня ничего не сработало.
Я использовал весеннюю загрузку с гибернацией. Версия для весенней загрузки была ~ 2.0.1, и я продолжал получать эту ошибку и исключение нулевого указателя при компиляции. Проблема была с Hibernate, который нуждался в повышении версии. Но после этого у меня возникли некоторые другие проблемы, которые, как казалось, не обрабатывали аннотации процессора, поэтому я решил просто поднять весну с версии 2.0.1 до версии 2.1.7, и все заработало, как и ожидалось.

Вам все еще нужно добавить вышеупомянутый плагин жестко
Надеюсь, это поможет!