You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题原因

  1. SpringBoot Jar的特殊启动逻辑:SpringBoot的可执行Jar主类是JarLauncher,它会读取Start-Class来启动你的应用,但exewrap/Launch4j可能错误地直接以Start-Class作为主类启动,跳过了SpringBoot的加载流程,导致识别不了这个配置。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:17:35