运行可执行jar时:错误: 找不到或无法加载主类 原因: java.lang.NoClassDefFoundEr或错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

这是两个控制台报错,但是我放到一个文章中了,说明这两个报错是一个双子星组合,基本上都是出现在JavaFx项目和依赖于大量第三方java类库的项目中

这个报错一般是出现在maven构建package打包构建生成的jar运行时,出现的报错。如果是你通过手工或者idea工件构建的,一般不会出现这个类型报错。

这个错误通常是由于在运行包含 JavaFX 的 JAR 文件时缺少 JavaFX 库所导致的。JavaFX 在 JDK 11 之后已不再捆绑在 JDK 中,因此需要将 JavaFX 库添加到运行时的类路径中。

但是,我明明已经在maven中添加了fx的相关依赖,但是为什么还是出现找不到和无法加载主类呢

首先我们需要明白Spring项目和FX项目的不同之处:

Spring 项目
  • 使用类路径 (Classpath) 机制:传统的 Spring 项目使用类路径机制,通过 classpath 搜索所需的类和资源。Maven 依赖项会自动添加到类路径中,无需额外配置。
  • 无需 module-info.java:传统的非模块化项目不需要 module-info.java。所有依赖项通过类路径加载,无需明确声明哪些模块需要哪些依赖。
JavaFX 项目
  • 使用模块路径 (Module Path) 机制:JavaFX 项目在 JDK 9 之后被模块化,需要使用模块路径机制。模块路径可以更高效地管理模块和依赖关系。
  • 需要 module-info.java:为了利用模块系统的优势并明确模块之间的依赖关系,JavaFX 项目需要 module-info.java 文件。这在运行时帮助 JVM 确定模块依赖关系和访问规则。

这也就很好的解释了为什么我们刚刚创建的JAVAFX项目会有一个这个文件,而且删除就会报错了:

因此在使用maven将项目构建为jar后,尽管你在pom文件中已经引入了Fx的相关依赖,但module-info.java并不会一同被打包成jar,它作为模块引导类被独立于源代码之外了。

因此最后打包得到的jar虽然有fx的依赖,但是还是会显示无法加载到主类,因为就像是断了线的风筝。

a如果你使用的是idea的工件构建的jar包,运行时会出现

缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

这也是由于jar包缺少对应的fx依赖造成的,要解决这个问题,我们就需要在系统外部引入javafx依赖

我们下载fx的17版本https://gluonhq.com/products/javafx/

下载后解压,我们复制他的lib以上的路径

然后控制台在jar包所在的目录输入

java --module-path D:\openjfx-17.0.11_windows-x64_bin-sdk\javafx-sdk-17.0.11\lib --add-modules javafx.controls,javafx.fxml -jar toolkitforstudents-1.0-SNAPSHOT.jar

可以看到我们的fx项目可以成功被打开了

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值