Это моя сборка Maven
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<executions>
<execution>
<!-- Default configuration for running with: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>org.abos.gs.gui.fx.FxMenu</mainClass>
<launcher>app</launcher>
<jlinkZipName>app</jlinkZipName>
<jlinkImageName>app</jlinkImageName>
<noManPages>true</noManPages>
<stripDebug>true</stripDebug>
<noHeaderFiles>true</noHeaderFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Команда Maven — clean javafx:run
. И свойства pom, и свойства IntelliJ maven работают на Java 21.
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Тем не менее я получаю это сообщение об ошибке
Error: LinkageError occurred while loading main class org.abos.gs.gui.fx.FxMenu
java.lang.UnsupportedClassVersionError: org/abos/gs/gui/fx/FxMenu has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 62.0
что странно, потому что консоль начинается с
/usr/lib/jvm/jdk-21.0.1/bin/java
Есть идеи, что может быть не так?
Обновлено: по крайней мере, установка версии Java на 17 в pom и установка флажка «Делегировать действия сборки/запуска IDE в Maven» заставляет программу компилироваться и запускаться, но я хочу запустить ее на Java 21.
EDIT2: установка JAVA_HOME в мой JDK 21 решила проблему. Раньше мне это не было нужно, и я думаю, что это ошибка в maven или IntelliJ, которая не позволяет использовать JDK, который я явно указал.
Знаете ли вы, где еще можно проверить IntelliJ? Я ничего не могу найти.
Было бы интересно попробовать изменить эти два свойства компилятора на одно <maven.release>21</maven.release>
, а затем поставить галочку в этом поле. Делегировать действия по сборке/запуску IDE Maven.
@g00se Это просто сбрасывает версию до 8 каким-то образом «Сопоставление с образцом в экземпляре не поддерживается в -source 8»
Извините, так и должно было быть <maven.compiler.release>21</maven.compiler.release>
@ g00se g00se Тогда первоначальная проблема сохраняется. Но <maven.compiler.release>17</maven.compiler.release>
тоже работает.
В вашем случае, возможно, лучше взять прямое управление компилятором в плагине, поскольку выпуск более полезен, когда вы хотите «скомпилировать»
Вы бы, наверное, использовали <configuration><verbose>true</verbose><fork>true</fork><executable>/usr/lib/jvm/jdk-21.0.1/bin/javac</executable><compilerVersion>21</compilerVersion>
Вы можете указать JavaFX Maven Plugin, какую установку JDK использовать для связывания, одним из следующих способов:
JAVA_HOME
.ИЛИ
jlinkExecutable
в конфигурации плагина.Эти настройки не зависят от версии Java, используемой для выполнения цели подключаемого модуля Maven JavaFX javafx:jlink
.
Плагин Maven JavaFX поддерживает цепочку инструментов Maven , что позволяет выбирать цепочку инструментов (JDK/jlink/etc) с помощью maven-toolchain-plugin. (Я это не проверял и не проверял).
Плагин Maven JavaFX содержит код для поддержки цепочек инструментов maven. Когда цепочка инструментов настроена, она имеет приоритет над конфигурацией переменной среды JAVA_HOME
.
Что делает плагин Toolchains:
Плагины Toolchains позволяют совместно использовать конфигурацию инструмента между плагинами; например, чтобы убедиться, что такие плагины, как компилятор, Surefire и Javadoc, используют для выполнения один и тот же JDK, независимо от JRE, используемого для запуска самого Maven.
Установка
JAVA_HOME
на мой JDK 21 решила проблему. Раньше мне это не требовалось, и я думаю, что это ошибка в Maven или IntelliJ, которая не позволяет использовать JDK, который я явно указал.
Я не думаю, что это ошибка, я думаю, что это недокументированная функция плагина JavaFX maven (которая должна быть задокументирована, IMO).
Раньше я находил эту функцию весьма раздражающей при разработке приложений JavaFX в Idea, поскольку это означает, что вам нужно либо жестко запрограммировать путь к исполняемому файлу jlink в конфигурации плагина Maven JavaFX, либо полагаться на внешнюю переменную среды JAVA_HOME
, просто чтобы получить правильные настройки связи.
Просмотр исходного кода плагина Maven JavaFX показывает, что плагин определяет, где найти JDK из JAVA_HOME, если он определен. Это общий поиск, поэтому он работает для всех целей плагина (например, для целей javafx:jlink
и javafx:run
).
В качестве альтернативы поиск на основе параметра конфигурации jlinkExecutable документирован в параметрах плагина.
Информация в этом ответе относится к версии 0.0.8 плагина JavaFX Maven и может не применяться к другим версиям.
Общая информация о решении проблем связи с Java (не касается непосредственно конфигурации и работы подключаемого модуля Maven JavaFX):
Вы используете Java 18. Это соответствует версиям файлов классов до 62. Дважды проверьте конфигурацию intellij.