Maven项目跨平台构建失败:无法解析JavaFX依赖求助
错误信息
[ERROR] Failed to execute goal on project RNGame: Could not resolve dependencies for project com.ceebee:RNGame:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: org.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3 (absent), org.openjfx:javafx-graphics:jar:${javafx.platform}:21.0.3 (absent), org.openjfx:javafx-base:jar:${javafx.platform}:21.0.3 (absent), org.openjfx:javafx-fxml:jar:${javafx.platform}:21.0.3 (absent), org.openjfx:javafx-media:jar:${javafx.platform}:21.0.3 (absent): Could not find artifact org.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3 in central (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环境
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"
跨平台情况
- Linux环境(Maven 3.9.6):项目可正常构建
- Windows 10/macOS 13.4.1:执行
mvn clean install出现上述依赖解析错误,相关JavaFX artifacts已存在于本地.m2仓库,手动指定<classifier>mac</classifier>无效,无特殊Maven配置,环境变量配置正确。
排查方向建议
- 检查
${javafx.platform}变量来源:错误中该变量未被替换,排查Linux环境是否通过settings.xml、profile或系统属性隐式注入了该变量,Windows/macOS缺少对应配置。可在pom.xml的<properties>中显式添加<javafx.platform>并设置对应值(mac、win、linux),或引入插件自动识别系统平台。 - 调整JavaFX依赖声明:当前pom同时引入了javafx的pom依赖和单个模块依赖,可能存在冲突。尝试移除单个模块依赖,仅保留javafx的pom依赖;或确保单个模块依赖通过
<classifier>正确指定平台,且与当前系统匹配。 - 升级javafx-maven-plugin:当前使用的0.0.8版本较旧,尝试升级到最新稳定版,新版本插件通常会自动处理平台依赖的classifier,避免手动配置冲突。
- 清理Maven缓存:执行
mvn clean install -U强制更新依赖,或手动删除本地.m2仓库中org/openjfx目录后重新构建,排除缓存损坏问题。 - 统一Maven版本:Linux使用3.9.6,Windows/macOS使用3.9.7,尝试在Windows/macOS降级到3.9.6,确认是否是版本兼容性导致的问题。
- 验证架构匹配:macOS为x86_64架构,确认本地仓库中JavaFX artifacts的架构与系统一致,避免arm64和x86_64版本混存。
- 查看Maven调试日志:执行
mvn clean install -X,分析依赖解析的详细过程,确认Maven查找的artifact路径是否正确,是否有配置覆盖了classifier或属性。
内容的提问来源于stack exchange,提问作者GenerationLost

