Невозможно скомпилировать простой проект 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
Есть ли способ это исправить?
11 ответов
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
ОБНОВИТЬ
Ответ сейчас устарел. Смотрите этот ответ.
В качестве альтернативы, по состоянию на 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 с этой версией. - заметки о выпуске.
Возможно, это не та же самая ошибка, но у меня была похожая ошибка.
Проверьте Maven Java-версию
Поскольку Maven также работает с Java, сначала проверьте, на какой версии работает ваш Maven:
mvn --version | grep Java
Возвращает:
Java версия 1.8.0_151, поставщик: Oracle Corporation, среда выполнения: 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-compiler-plugin:3.8.0: скомпилировать (default-compile) для проекта efa-example-commons-task: Неустранимая ошибка компиляции: недопустимый целевой выпуск: 11 -> [Помощь 1]
Как установить конкретную версию Java для Maven
Логическая вещь, которую нужно сделать, это установить более высокую версию Java в Maven (например, Java версия 11 вместо 1.8).
Maven использует переменную среды JAVA_HOME
найти версию Java для запуска. Поэтому измените эту переменную на JDK, с которым вы хотите скомпилировать (например, OpenJDK 11).
Санитарная проверка
Тогда беги снова mvn --version
чтобы убедиться, что конфигурация позаботилась о:
λ mvn - версия | grep Java Версия Java: 11.0.2, поставщик: Oracle Corporation, среда выполнения: C:\tools\jdk\openjdk11
Что гораздо лучше и правильнее для компиляции кода, написанного со спецификациями Java 11.
Укажите 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>
Увеличение вашего maven-compiler-plugin до 3.8.0 кажется необходимым, но не достаточным. Если у вас все еще есть проблемы, вы также должны убедиться, что ваша переменная среды JAVA_HOME установлена в Java 10 (или 11), если вы работаете из командной строки. (Полученное сообщение об ошибке не скажет вам этого.) Или, если вы работаете из IDE, вам нужно убедиться, что оно настроено для запуска maven с вашим текущим JDK.
Если вы используете весеннюю загрузку, добавьте эти теги в 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. Меня устраивает.
В моем случае мне пришлось явно установить JAVA_HOME в JDK-11 в моем скрипте, хотя терминал показывает версию Java 11.
Это произошло потому, что я выполняю через сценарий оболочки и использую JDK по умолчанию для моей машины, которая была JDK8.
Я подтвердил, какая версия JDK используется
mvn
в скрипте и установите JDK-11, как показано ниже:
#!/bin/bash
echo $(java -version)
echo $(mvn --version | grep -i java )
export JAVA_HOME="/opt/jdk11/"
export PATH=$JAVA_HOME/bin:$PATH
echo $(java -version)
echo $(mvn --version | grep -i java )
mvn
может использоватьJAVA_HOME
, но если настройка не работает, в реальных сценариях mvn могут быть переопределения
Например, в моей системе (mac), на которую mvn указывает/usr/local/bin/mvn
что на самом деле указывает на/usr/local/Cellar/maven/3.8.6/bin/mvn
, который представляет собой сценарий bash, указывающий на/usr/local/Cellar/maven/3.8.6/libexec/bin/mvn
и этот скрипт читается так вверху:
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
Таким образом, он показывает, что ищет env в 3 разных местах, если толькоMAVEN_SKIP_RC
установлен.
Если я побегуMAVEN_SKIP_RC=1 mvn -version
, теперь учитывается JAVA_HOME.
но настоящее исправление - найти виновника в файлах mavenrc
В моем случае единственным присутствующим файлом был/etc/mavenrc
и он гласил:
JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
Таким образом, он устанавливал java 1.8 по умолчанию, переопределяя исходный JAVA_HOME.
измените это на -v 11, и он будет работать как положено. Или просто полностью удалите /etc/mavenrc, чтобы восстановить значение по умолчанию для JAVA_HOME.
В моем случае,
- "echo $JAVA_HOME" показывает версию 11
- "java -version" показывает версию 11
- Однако «mvn -version» показывает, что «версия Java» НЕ 11
Я вставляю это поверх .bash_profile и загружаю его. Оно работает.
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
alias java8='export JAVA_HOME=$JAVA_8_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
alias java11='export JAVA_HOME=$JAVA_11_HOME;export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH'
java11
Если ничего не работает и даже после того, как вы установили JAVA_HOME на правильный путь, проверьте, нет ли переопределения пути JAVA_HOME в
<user>/.mavenrc
!
Хорошо, у меня ничего не работало.
Я использовал весеннюю загрузку с гибернацией. Версия весенней загрузки была ~2.0.1, и я бы продолжал получать эту ошибку и исключение нулевого указателя при компиляции. Проблема была в спящем режиме, который требовал повышения версии. Но после этого у меня возникли некоторые другие проблемы, которые казались мне нераспознаваемыми, поэтому я решил просто переключить Spring с версии 2.0.1 на версию 2.1.7, и все заработало, как ожидалось.
Вам все еще нужно добавить вышеупомянутый плагин.
Надеюсь, это поможет!