Мне нужен совет о том, как устранить эту проблему, возникшую в моем проекте, поэтому минимального воспроизводимого примера кода не будет, поскольку речь идет не о самом коде.
Maven и Java правильно настроены и работают на всех машинах и операционных системах. Первоначально проект был создан с помощью IntelliJ в Linux и без проблем работал на любой машине с Linux. Однако попытка запустить mvn clean install в Windows или macOS в проекте всегда приводит к следующей ошибке:
[ОШИБКА] Не удалось выполнить цель проекта RNGame: не удалось решить зависимости для проекта com.ceebee:RNGame:jar:1.0-SNAPSHOT: следующие артефакты не удалось устранить: org.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3 (отсутствует), org.openjfx:javafx-graphics:jar:${javafx.platform}:21.0.3 (отсутствует), org.openjfx:javafx-base:jar:${javafx.platform}:21.0.3 (отсутствует), org.openjfx:javafx-fxml:jar:${javafx.platform}:21.0.3 (отсутствует), org.openjfx:javafx-media:jar:${javafx.platform}:21.0.3 (отсутствует): Мог бы не найти артефакт org.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3 в центре (https://repo.maven.apache.org/maven2)
Это мой текущий pom.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ceebee</groupId>
<artifactId>RNGame</artifactId>
<version>1.0-SNAPSHOT</version>
<name>RNGame</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.8.2</junit.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>21.0.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>21.0.3</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>21.0.3</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>21.0.3</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>20</source>
<target>20</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</path>
</annotationProcessorPaths>
</configuration>
</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>com.ceebee.rngame/com.ceebee.rngame.RNGame</mainClass>
<launcher>RNGame.sh</launcher>
<jlinkZipName>RNGame</jlinkZipName>
<jlinkImageName>RNGame</jlinkImageName>
<stripDebug>true</stripDebug>
<stripJavaDebugAttributes>true</stripJavaDebugAttributes>
<noManPages>true</noManPages>
<stripDebug>true</stripDebug>
<noHeaderFiles>true</noHeaderFiles>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>copy-external-resources</id>
<phase>generate-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/res</outputDirectory>
<resources>
<resource>
<directory>res</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Я использую как macOS 13.4.1, так и Windows 10. Вот результат mvn --version для Mac, включая всю необходимую информацию:
Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0) Maven домашняя страница: /usr/local/Cellar/maven/3.9.7/libexec Версия Java: 21.0.3, поставщик: Homebrew, время выполнения: /usr/local/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home Языковой стандарт по умолчанию: en_GB, кодировка платформы: UTF-8, имя ОС: «mac os x», версия: «13.4.1», арка: «x86_64», семейство: «mac»
Версия Maven для Linux — 3.9.6. Я не нашел много информации по этому конкретному вопросу в Интернете. Моя среда настроена одинаково на каждой машине. Проект можно прекрасно собрать на любой другой машине с Linux, но не на Windows/macOS. Соответствующие артефакты JavaFX загружаются и присутствуют в каталоге .m2, но Maven, похоже, не может их разрешить. Специальных настроек Maven нет. Подсказка о {javafx.platform} мне не очень помогает, так как указание этого свойства, например, <classifier>mac</classifier> не помогает.
Все настройки в Windows/macOS свежие, с правильными переменными среды и командами Java и mvn, распознаваемыми в командной строке/терминале. Будем признательны за любые подсказки о том, как действовать по этому вопросу.
К вашему сведению, я предоставил помпон. Сокращу ОП. Будем признательны за любые советы о том, как получить «рабочий помпон, работающий в Windows».
Я не согласен с некоторыми предыдущими комментариями, некоторые детали важны, по моему мнению, и лучше всего предоставить pom.xml в вопросе, а не за пределами сайта.
Я заметил, что ваш pom.xml содержит зависимость типа <groupId>org.openjfx</groupId><artifactId>javafx</artifactId><version>21.0.3</version><type>pom</type>. Хотя это может сработать, я не уверен, какой цели оно служит, и не рекомендую его (другие проекты JavaFX, которые я видел, этого не делают).
@jewelsea Если это проект Maven, то не должно ли mvn package работать? Это избавило бы от многих догадок в решении проблемы. GenerationLost, вы попробовали начало работы Это сгенерирует проект с помощью pom, и вы сможете собрать его с помощью maven. Вы можете изменить pom, чтобы иметь правильные версии javafx. Я думаю, вы улучшили вопрос, удалив часть информации о настройках Linux.
@matt Я думаю, что maven терпит неудачу на более раннем этапе, поэтому, вероятно, не имеет значения, mvn package это или mvn install. Мой проект был создан IntelliJ (информация, которую я удалил из своего OP), и я добавил зависимости к другим артефактам FX по мере необходимости без каких-либо предварительных проблем. Я уже всегда мог строить на Linux. Создание новых проектов, например. macOS приведет к той же проблеме при установке версии JavaFX >=17. @jewelsea удаление упомянутой вами части, к сожалению, не имеет никакого значения, я уже это пробовал.
@matt да, пакет mvn должен работать. Однако это не для спрашивающего. Я попробовал использовать предоставленный pom.xml, чтобы посмотреть, смогу ли я заставить пакет mvn работать для меня в среде (Intel Mac), и он работал нормально. Итак, какова бы ни была проблема, она, похоже, связана с окружающей средой.
Подходит ли вам обходной путь, предложенный в моем ответе (явная установка классификаторов)?
@matt как для macOS 13.4.1, так и для Windows 10. Вот результат mvn --version, включая всю необходимую информацию: Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0) Maven home: /usr/local/Cellar/maven/3.9.7/libexec Java version: 21.0.3, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home Default locale: en_GB, platform encoding: UTF-8 OS name: "mac os x", version: "13.4.1", arch: "x86_64", family: "mac". Дайте мне знать, если вам нужна дополнительная информация, я добавлю ее в ОП.
@matt Спасибо, что проверили с вашей стороны, Jewelsea предложила что-то подобное, я пробовал, но безрезультатно. Что меня больше всего смущает во всем этом, так это то, что он работает на обеих моих машинах с Linux, поэтому сам пом кажется работоспособным.
@matt Я попробовал стандартный архетип pom без дополнений и получил ту же ошибку. JAVA_HOME фактически отсутствовал в .bash_profile на Mac. Добавим его как /usr/local/opt/openjdk, но это не изменит проблему с maven. В Windows я вручную настроил переменные env, чтобы они указывали на мои локальные JDK и Maven, так что это не должно быть проблемой.
Следующий шаг — использовать пакет mvn -X и вставить куда-нибудь полный вывод. Возможно ли, что вы не можете загрузить необходимые артефакты?
@matt, вот результат этого на Pastebin: Pastebin.com/4XV6UWDh Артефакты фактически втягиваются в мой локальный .m2, и я могу найти, например, javafx-controls-22.0.1-mac.jar среди всех других зависимостей, определенных в pom.
Можете ли вы попробовать еще раз и включить -U, чтобы принудительно обновить. Он говорит, что не находит зависимости, но и не пытается. Возможно ли, что вы не используете репозиторий .m2?
@matt Я также несколько раз пробовал переключатель -U. Вы правы, похоже, что он даже не использует .m2, что странно, поскольку артефакты фактически переносятся в репозиторий .m2 даже после того, как я его удалю. Где и как я могу это проверить? echo $M2_HOME указывает на /Users/myusername/.m2, а в моем .m2 нет файла settings.xml, поэтому я предполагаю, что используются настройки по умолчанию, для которых для репозитория установлено значение Default: ${user.home}/.m2/repository. Этот каталог действительно существует и содержит артефакты FX среди других зависимостей.
Вы можете просто удалить каталог .m2. Это кэш, и он будет воссоздан (вы можете проверить содержимое после восстановления и увидите, что туда загружено много чего). Не похоже, что это будет иметь большое значение, но я думаю, вы могли бы попробовать это на случай, если где-то есть какой-то поврежденный артефакт или настройка. Кроме того, JavaFX кэширует некоторые данные времени выполнения в ~/.openjfx, вы также можете удалить их, и они будут воссозданы, но, опять же, вероятно, это не ваша проблема, поскольку более поздний кеш используется во время выполнения, а не во время сборки.
@jewelsea Я знаю, и я тоже сделал это, но безрезультатно. Похоже, у меня заканчиваются варианты.
Вам следует попробовать перейти на maven 3.9.6, у меня это отлично работает в Windows, но в 3.9.7 не удается собрать даже пример helloworld из javafx.
@matt Да, это действительно сработало! Я только что дважды проверил, репозиторий моего дистрибутива Linux также не обновился до Maven 3.9.7 и все еще находится на версии 3.9.6, поэтому у меня не было проблем. В любом случае, спасибо за вашу помощь, я ценю это.
На данный момент у меня нет установки Maven 3.9.7, но думаю, что смогу попробовать ее позже. Мне интересно, сможет ли mvn package -Djavafx.platform=mac (или другой подходящий классификатор) обойти эту проблему, т. е. явно установить неразрешенное свойство в командной строке.
@jewelsea Конечно, это работает для окон с -Djavafx.platform=win




Обновление: Маркус Фридли в своем ответе отмечает, что проблема решена путем понижения версии Maven с 3.9.7 до 3.9.6.
Некоторая информация в этом ответе была написана до того, как об этом стало известно.
Это (на данный момент) неправильный ответ на ваш вопрос, но он предоставляет некоторую справочную информацию и потенциальное обходное решение (явная установка правильного значения классификатора), которое может вам подойти.
Обходной путь: явно установите классификаторы в pom.xml.
К сожалению, предложенный обходной путь не сработал для спрашивающего.
Вы можете обойти это, явно установив классификатор, соответствующий вашей системе, из меню классификаторов, которое я предоставил выше. Если вы это сделаете, вы должны выбрать классификатор, соответствующий вашей системе (например, darwin не является допустимым классификатором, а mac предназначен только для компьютеров Mac Intel, а не компьютеров Mac M1 и т. д.).
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>21.0.3</version>
<classifier>mac-aarch64</classifier>
</dependency>
Рекомендация: удалите артефакт org.openjfx:javafx::pom.
К сожалению, эта рекомендация не решает проблему спрашивающего, но, тем не менее, ее рекомендуется использовать.
Я заметил, что ваш pom.xml включает зависимость типа pom:
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>21.0.3</version>
<type>pom</type>.
Хотя это не вызвало никаких проблем в моей среде, я не рекомендую иметь такую зависимость. Другие проекты JavaFX, которые я видел, этого не делают. Этот pom должен быть родительским проектом для других модулей JavaFX, именно он позволяет модулям JavaFX по умолчанию выбирать для себя правильный классификатор при их включении. Вам это не нужно как зависимость в вашем проекте.
Справочная информация
Цель этой информации — объяснить ${javafx.platform}.
${javafx.platform} пытается установить классификатор.
Классификаторы могут использоваться разными проектами для разных целей.
JavaFX использует их для предоставления координат Maven версиям артефактов для определенных платформ, например. Intel Mac, Mac серии M, Windows x64 и т. д.
Вы можете найти классификаторы, просмотрев репозиторий Maven для JavaFX:
Там вы можете видеть, что используются следующие классификаторы:
Весь код (как Java, так и собственный) на самом деле находится в классифицированных артефактах, а не в несекретном пустом jar-файле оболочки. В этом смысле артефакты JavaFX Maven выглядят немного странно, поскольку большинство проектов помещают свой Java-код в несекретный jar-файл. JavaFX этого не делает, потому что в каждом из классифицированных Jars есть разные Java и собственный код. Например, в Mac Jars есть как собственный, так и Java-код для поддержки системного меню Mac, которое не требуется ни в одном другом jar-файле.
Когда артефакты Maven используются работающим приложением JavaFX, оно извлекает собственные компоненты из артефактов во время выполнения и помещает их в каталог локального кэша. Это отличается от использования JavaFX SDK, где jar-файлы SDK не включают собственные компоненты, а собственные компоненты загружаются из каталога SDK lib.
Обычно вам не нужно указывать классификатор при добавлении зависимости (если только вы не хотите получать зависимости для платформ, отличных от вашей системы разработки).
Если вы посмотрите на pom.xml на наличие зависимости JavaFX.
Вы можете видеть, что он добавляет классификатор ${javafx.platform}:
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>22.0.1</version>
<parent>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>22.0.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>22.0.1</version>
<classifier>${javafx.platform}</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>22.0.1</version>
</dependency>
</dependencies>
</project>
Обычно Maven может разрешить свойство ${javafx.platform} и установить для него соответствующий классификатор, который будет использоваться для машины, на которой вы строите.
Это происходит потому, что каждый из файлов JavaFX pom.xml использует общий родительский pom, который активирует профиль, который устанавливает свойство ${javafx.platform} в зависимости от вашей архитектуры. Это упрощенная версия pom.xml, демонстрирующая, как это делается:
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>22.0.1</version>
<packaging>pom</packaging>
<name>openjfx</name>
<description>OpenJFX JavaFX</description>
<properties>
<javafx.version>22.0.1</javafx.version>
</properties>
<profiles>
<profile>
<id>linux-x86_64</id>
<activation>
<os>
<name>linux</name>
<arch>amd64</arch>
</os>
</activation>
<properties>
<javafx.platform>linux</javafx.platform>
</properties>
</profile>
<profile>
<id>linux-aarch64</id>
<activation>
<os>
<name>linux</name>
<arch>aarch64</arch>
</os>
</activation>
<properties>
<javafx.platform>linux-aarch64</javafx.platform>
</properties>
</profile>
<profile>
<id>macosx-x86_64</id>
<activation>
<os>
<name>mac os x</name>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<javafx.platform>mac</javafx.platform>
</properties>
</profile>
<profile>
<id>macosx-aarch64</id>
<activation>
<os>
<name>mac os x</name>
<arch>aarch64</arch>
</os>
</activation>
<properties>
<javafx.platform>mac-aarch64</javafx.platform>
</properties>
</profile>
<profile>
<id>windows-x86_64</id>
<activation>
<os>
<family>windows</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<javafx.platform>win</javafx.platform>
</properties>
</profile>
<profile>
<id>javafx.platform.custom</id>
<activation>
<property>
<name>javafx.platform</name>
</property>
</activation>
<properties>
<javafx.platform>${javafx.platform}</javafx.platform>
</properties>
</profile>
</profiles>
</project>
По какой-то причине (опять же не знаю по какой) этот механизм замены ${javafx.platform} классификатором для вашей системы не сработал.
Большое спасибо за понимание, эта информация действительно ценна. Я также ожидал, что maven самостоятельно определит платформу. Однако даже предоставление классификатора в pom не помогает. В моем случае это будет <classifier>mac</classifier>, поскольку я действительно использую Intel Mac.
Я сталкиваюсь с той же проблемой при использовании maven 3.9.7. Он по-прежнему работает с maven 3.9.6.
Билет maven уже существует https://issues.apache.org/jira/browse/MNG-8131
Хороший звонок! Я использовал 3.9.6 и не думал, что эта версия имеет значение. Я попробовал 3.9.7, и он не смог скомпилировать базовый пример javafx.
Это действительно виновник, спасибо вам за это огромное! Я совершенно не заметил, что версия Maven моего дистрибутива Linux осталась на версии 3.9.6, поэтому она работала на моих машинах с Linux. После новой настройки в macOS и Windows я получил последнюю версию, в которой, по-видимому, есть эта проблема. Как можно сообщить об этом, или с Apache уже зарегистрирована известная проблема?
Вы можете уведомить команду JavaFX через список рассылки openjfx-dev . У команды Apache Maven есть процесс сообщения об ошибках, и это, наверное, лучший способ, я думаю.
Обновление: проблема, похоже, связана с pom OpenFX, о них также сообщили: mail.openjdk.org/pipermail/openjfx-dev/2024-May/047279.html
Проблема с помом JavaFX была исправлена в JavaFX 23-ea+20 (от Maven Central), и он снова работает с maven 3.9.7.
JavaFX 23-ea-20 решает проблему с mvn CLI. Но раньше с JavaFX 21 IntelliJ IDEA работал, но позже больше не работает. Я решил придерживаться CLI.
Проблема Maven , ссылка на которую указана в тексте, исправлена в Maven 3.9.8.
Обсуждение было очень полезным.
Я перешел на Maven 3.9.7 несколько дней назад, и все мои проекты с OpenJFX 22.0.1 не удалось собрать.
Я создал небольшой проект с одним файлом pom.xml (см. ниже) и протестировал его на Windows 11 и Ubuntu 24.04 с Oracle JDK 22.0.1 и разными версиями Maven и OpenJFX.
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.olexyarm</groupId>
<artifactId>TestMaven</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>TestMaven</name>
<properties>
<javafx.version>22.0.1</javafx.version>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
</project>
Сборка с помощью Maven 3.9.7 и OpenJFX 22, 22.0.1, 22.0.2 все время завершалась неудачей с ошибкой ниже:
[ERROR] Failed to execute goal on project TestMaven: Could not resolve dependencies for project com.olexyarm:TestMaven:jar:1.0.0: The following artifacts could not be resolved: org.openjfx:javafx-cont
rols:jar:${javafx.platform}:22.0.1 (absent), org.openjfx:javafx-graphics:jar:${javafx.platform}:22.0.1 (absent), org.openjfx:javafx-base:jar:${javafx.platform}:22.0.1 (absent): Could not find artifact
org.openjfx:javafx-controls:jar:${javafx.platform}:22.0.1 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
Сборка с помощью Maven 3.9.6 и OpenJFX 22, 22.0.1, 22.0.2 всегда была успешной.
Сборка с использованием Maven 3.9.7 и OpenJFX 23-ea+22 прошла успешно.
Судя по всему, в вашем pom-файле что-то не так… лучше всего было бы иметь pom-файл..