Более новая версия JDK используется, но не распознается в JavaFX?

Это моя сборка 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, который я явно указал.

Вы используете Java 18. Это соответствует версиям файлов классов до 62. Дважды проверьте конфигурацию intellij.

Elliott Frisch 24.06.2024 17:55

Знаете ли вы, где еще можно проверить IntelliJ? Я ничего не могу найти.

SK19 24.06.2024 17:57

Было бы интересно попробовать изменить эти два свойства компилятора на одно <maven.release>21</maven.release>, а затем поставить галочку в этом поле. Делегировать действия по сборке/запуску IDE Maven.

g00se 24.06.2024 18:10

@g00se Это просто сбрасывает версию до 8 каким-то образом «Сопоставление с образцом в экземпляре не поддерживается в -source 8»

SK19 24.06.2024 18:18

Извините, так и должно было быть <maven.compiler.release>21</maven.compiler.release>

g00se 24.06.2024 18:24

@ g00se g00se Тогда первоначальная проблема сохраняется. Но <maven.compiler.release>17</maven.compiler.release> тоже работает.

SK19 24.06.2024 18:34

В вашем случае, возможно, лучше взять прямое управление компилятором в плагине, поскольку выпуск более полезен, когда вы хотите «скомпилировать»

g00se 24.06.2024 19:45

Вы бы, наверное, использовали <configuration><verbose>true</verbose><fork>true</fork><exec‌​utable>/usr/lib/jvm/‌​jdk-21.0.1/bin/javac‌​</executable><compil‌​erVersion>21</compil‌​erVersion>

g00se 24.06.2024 19:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решения

Вы можете указать 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

Просмотр исходного кода плагина Maven JavaFX показывает, что плагин определяет, где найти JDK из JAVA_HOME, если он определен. Это общий поиск, поэтому он работает для всех целей плагина (например, для целей javafx:jlink и javafx:run).

В качестве альтернативы поиск на основе параметра конфигурации jlinkExecutable документирован в параметрах плагина.

Используемая версия плагина JavaFX Maven

Информация в этом ответе относится к версии 0.0.8 плагина JavaFX Maven и может не применяться к другим версиям.

Связанный

Общая информация о решении проблем связи с Java (не касается непосредственно конфигурации и работы подключаемого модуля Maven JavaFX):

Другие вопросы по теме