
运行可执行jar时:错误: 找不到或无法加载主类 原因: java.lang.NoClassDefFoundEr或错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
这个报错一般是出现在maven构建package打包构建生成的jar运行时,出现的报错。如果是你通过手工或者idea工件构建的,一般不会出现这个类型报错。
这是两个控制台报错,但是我放到一个文章中了,说明这两个报错是一个双子星组合,基本上都是出现在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项目可以成功被打开了
更多推荐
所有评论(0)