更新:Markus Friedli 在他的回答中指出,通过将 Maven 3.9.7 降级到 3.9.6,该问题已得到解决
这个答案中的一些信息是在人们知道这一点之前写的。
这(目前)不是您的问题的真正答案,但它确实提供了一些背景信息和潜在的解决方法(明确将分类器设置为正确值),这可能对您有用。
解决方法:在 pom.xml 上明确设置分类器
不幸的是,这个建议的解决方法对于提问者来说并不奏效。
您可以通过从我上面提供的分类器菜单中明确将分类器设置为适合您系统的分类器来解决这个问题。如果这样做,您必须选择与您的系统匹配的分类器(例如, darwin
不是有效的分类器, mac
仅适用于 Intel mac,不适用于 M1 mac,等等)。
<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}
正在尝试设置 classifier .
不同的项目可以使用分类器来实现不同的目的。
JavaFX 使用它们为特定平台的工件版本提供 Maven 坐标,例如 intel mac、vs m 系列 mac、vs windows x64 等。
您可以通过查看 JavaFX 的 Maven 存储库找到分类器:
-
https://repo1.maven.org/maven2/org/openjfx/javafx-graphics/22.0.1/
您可以看到所使用的分类器是:
-
来源 -> 源代码
-
javadoc->文档
-
胜利 -> Windows x64
-
Linux -> Linux x64
-
linux-aarch64 -> Linux arm (64 位)
-
苹果电脑 -> 英特尔苹果电脑
-
mac-aarch64 -> M 系列 Mac
-
无分类器 -> 空壳罐
所有代码(Java 和本机代码)实际上都在分类工件中,而不是未分类的空壳 jar 中。JavaFX Maven 工件在这方面有点奇怪,因为大多数项目都将其 Java 代码放在未分类的 jar 中。JavaFX 不会这样做,因为每个分类 Jar 中都有不同的 Java 和本机代码。例如,在 Mac Jar 中,有本机和 Java 代码来支持 Mac 系统菜单,而其他任何 jar 中都不需要它。
当正在运行的 JavaFX 应用使用 Maven 工件时,它会在运行时从工件中提取本机组件并将其放入本地缓存目录中。这与使用 JavaFX SDK 时不同,在 JavaFX SDK 中,SDK jar 不包含本机组件,并且本机组件是从 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 ,该 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}
用系统分类器替换的机制都不起作用。