Maven构建的JavaFX JAR无法运行,报错找不到主类及依赖类
问题原因
maven-jar-plugin生成的是瘦JAR,仅包含你的项目代码,不会自动打包JavaFX等第三方依赖类。而javafx:run命令是通过JavaFX Maven插件自动处理了模块路径和依赖加载,所以能正常启动,但直接运行瘦JAR时,JVM找不到JavaFX相关类,就会抛出NoClassDefFoundError。
解决方案:生成包含所有依赖的胖JAR
使用maven-shade-plugin插件将项目代码和所有依赖(包括JavaFX类)打包成一个可执行的胖JAR,步骤如下:
在你的pom.xml的<build><plugins>节点中添加以下插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定主类,让JAR可直接执行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.openjfx.App</mainClass> </transformer> <!-- 处理JavaFX的服务配置,避免模块化冲突 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 排除签名文件,防止打包时出现重复签名错误 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
运行步骤
- 执行打包命令:
mvn clean package
- 在
target目录下找到带-shaded后缀的JAR文件(比如hellofx-1.0-SNAPSHOT-shaded.jar),运行它:
java -jar hellofx-1.0-SNAPSHOT-shaded.jar
补充说明
如果你的项目是模块化的(带有module-info.java),maven-shade-plugin可能需要额外配置模块合并,但对于大多数学校项目的非模块化JavaFX结构,上述配置足够使用。
内容的提问来源于stack exchange,提问作者Johan Daniel
相关产品推荐
相关产品推荐

