JavaFX 21:尽管Maven依赖中已包含javafx-media,仍然抛出ClassNotFoundException: javafx.media.MediaView
我正在用Maven和 module-info.java 开发一个JavaFX 21桌面应用。我最近在我的 pom.xml 中添加了 javafx-media 依赖来显示后台视频,但应用在运行时失败,错误如下:
Caused by: java.lang.ClassNotFoundException: javafx.media.MediaView
at [email protected]/javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:3062)
...
我的环境:
- Java版本: 21.0.10
- JavaFX版本: 21.0.2
- 构建工具: Maven
- IDE: IntelliJ IDEA 2025.3.2
我的 pom.xml 依赖:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>${javafx.version}</version>
</dependency>
我的 module-info.java:
module com.plasticstock {
requires javafx.controls;
requires javafx.fxml;
requires javafx.media;
requires java.sql;
opens com.plasticstock to javafx.fxml;
opens com.plasticstock.controllers to javafx.fxml;
opens com.plasticstock.models to javafx.base;
exports com.plasticstock;
exports com.plasticstock.controllers;
exports com.plasticstock.models;
}
我尝试过的做法:
- 确认
javafx-media已正确下载并能在 “External Libraries” 中看到。 - 多次执行
mvn clean install。 - 使IntelliJ的缓存失效并重启。
- 尝试将
--add-modules javafx.media添加到VM选项,但在引导层初始化时导致java.lang.module.FindException: Module javafx.media not found。
看起来 FXMLLoader 在运行时无法访问 javafx.media 模块,尽管它已在 module-info.java 中声明。
问题: 如何正确配置一个模块化的JavaFX Maven项目,使在运行时能够正确识别 javafx-media 模块,而不触发 FindException 或 ClassNotFoundException?
解决方案
在 javafx.media 模块中没有名为 javafx.media.MediaView 的类。实际的类名是 javafx.scene.media.MediaView。
你的 ClassNotFoundException 是由一个 FXMLLoader 抛出的。这表明加载器认为它解析出了正确的类名,但在通过反射加载类时失败了。这意味着你很可能在某个FXML文件中有如下错误的导入:
<?import javafx.media.MediaView?>
修正该导入后,ClassNotFoundException 应该会消失。
另一个问题是 FindException。要找出原因,我们需要一个最小可复现示例(minimal reproducible example)。具体来说,我们需要看到完整的POM,以及运行应用程序所使用的命令。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。