SpringBoot+OpenJFX打包Windows EXE遇Start-Class异常求助
SpringBoot + OpenJFX 打包EXE提示Start-Class未注册的解决办法
问题背景
用SpringBoot 3.4.1 + OpenJFX 21开发Windows桌面应用,可执行Jar单独运行没问题,但用exewrap或者Launch4j打包成EXE后,运行时弹出提示说MANIFEST.MF里没注册Start-Class,但明明Manifest里已经写了这个配置。环境是Windows 11 + IntelliJ,已经用jdeps处理过依赖,还打包了轻量JRE放在同级目录。
用户提供的Manifest内容:
Manifest-Version: 1.0 Created-By: Maven JAR Plugin 3.4.2 Build-Jdk-Spec: 21 Main-Class: org.springframework.boot.loader.launch.JarLauncher Start-Class: myPakage.myApp.MyAppApplication Spring-Boot-Version: 3.4.1 Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx
用户的POM核心配置(已简化):
<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>myPakage</groupId> <artifactId>myApp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>myApp</name> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.1</version> </parent> <properties> <start-class>myPakage.myApp.MyAppApplication</start-class> <java.version>21</java.version> <jfx.version>21.0.1</jfx.version> </properties> <!-- 依赖部分省略 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/libs</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>${start-class}</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.7.1</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>${start-class}</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
问题原因
- SpringBoot Jar的特殊启动逻辑:SpringBoot的可执行Jar主类是
JarLauncher,它会读取Start-Class来启动你的应用,但exewrap/Launch4j可能错误地直接以Start-Class作为主类启动,跳过了SpringBoot的加载流程,导致识别不了这个配置。 - Maven插件冲突:同时用了
spring-boot-maven-plugin和maven-assembly-plugin,后者生成的jar-with-dependencies会打乱SpringBoot Jar的内部结构,导致JarLauncher找不到Start-Class配置。
解决步骤
1. 清理冗余的Maven插件
删掉maven-dependency-plugin的copy-dependencies配置和整个maven-assembly-plugin,因为SpringBoot插件会自动处理依赖打包,不需要手动复制依赖或者生成胖包:
<!-- 移除这两个插件配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> ... </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> ... </plugin>
2. 修正SpringBoot插件配置
去掉spring-boot-maven-plugin里手动指定的mainClass,让插件自动读取start-class属性,保证生成的Jar是标准的SpringBoot可执行格式:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <!-- 移除<configuration>里的<mainClass>${start-class}</mainClass> --> </plugin>
3. 调整EXE打包工具的主类配置
不管用exewrap还是Launch4j,都要把主类设置为org.springframework.boot.loader.launch.JarLauncher,而不是你的业务主类myPakage.myApp.MyAppApplication:
- Launch4j:在配置界面的「Main Class」输入框填写
org.springframework.boot.loader.launch.JarLauncher,同时指定好JRE路径和Jar文件路径。 - exewrap:在打包参数里指定主类为
org.springframework.boot.loader.launch.JarLauncher,确保EXE和SpringBoot Jar、轻量JRE在同一目录。
4. 验证打包后的Jar
重新执行mvn clean package生成Jar,解压后检查META-INF/MANIFEST.MF,确认Main-Class是JarLauncher,Start-Class是你的应用主类。
5. 测试运行
- 先直接运行Jar:
java -jar target/myApp-0.0.1-SNAPSHOT.jar,确认应用正常启动。 - 再运行打包后的EXE,检查是否还有Start-Class的错误提示。
内容的提问来源于stack exchange,提问作者tako21osan
相关产品推荐
相关产品推荐

