Невозможно скомпилировать простой проект 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, и все заработало, как и ожидалось.
Вам все еще нужно добавить вышеупомянутый плагин жестко
Надеюсь, это поможет!