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

JavaFX项目使用JLink打包后MySQL-Connector无法正常工作求助

解决JavaFX项目JLink打包后MySQL连接失效问题

核心原因

MySQL Connector/J(原mysql-connector-java)属于非模块化JAR,而JLink仅处理模块化JAR文件。IDE运行时依赖类路径加载驱动,打包后的JLink镜像仅包含模块路径内容,导致驱动无法被发现。


方案1:通过自动模块整合进JLink镜像

MySQL Connector/J 8.x及以上版本自带自动模块名mysql.connector.j(旧版本为mysql.connector.java),可直接通过JLink配置将其纳入模块路径:

  1. 确认pom.xml中的MySQL依赖
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>
</dependency>
  1. 配置maven-jlink-plugin,添加自动模块并绑定服务(让JDBC驱动被自动发现)
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jlink-plugin</artifactId>
    <version>3.1.0</version>
    <extensions>true</extensions>
    <configuration>
        <moduleName>你的主模块名</moduleName>
        <outputDirectory>target/jlink-image</outputDirectory>
        <addModules>
            <addModule>mysql.connector.j</addModule>
            <!-- 按需添加你的JavaFX模块 -->
            <addModule>javafx.controls</addModule>
            <addModule>javafx.fxml</addModule>
        </addModules>
        <launcher>
            <name>AppLauncher</name>
            <module>你的主模块名/你的主类全路径</module>
        </launcher>
        <jlinkOptions>
            <jlinkOption>--bind-services</jlinkOption>
            <jlinkOption>--strip-debug</jlinkOption>
            <jlinkOption>--no-man-pages</jlinkOption>
            <jlinkOption>--no-header-files</jlinkOption>
        </jlinkOptions>
    </configuration>
</plugin>
  1. 在主模块的module-info.java中声明依赖
module 你的主模块名 {
    requires javafx.controls;
    requires javafx.fxml;
    requires mysql.connector.j;
    // 开放必要包给JDBC反射调用(如果需要)
    opens 你的DAO包路径 to java.sql;
}

方案2:用Moditect为MySQL驱动添加模块信息

如果自动模块方案无效,可通过Moditect生成并注入module-info.java到MySQL驱动JAR:

  1. 在pom.xml中添加Moditect插件配置
<plugin>
    <groupId>org.moditect</groupId>
    <artifactId>moditect-maven-plugin</artifactId>
    <version>1.0.0.Final</version>
    <executions>
        <execution>
            <id>add-module-info-to-mysql</id>
            <phase>package</phase>
            <goals>
                <goal>add-module-info</goal>
            </goals>
            <configuration>
                <modules>
                    <module>
                        <artifact>
                            <groupId>com.mysql</groupId>
                            <artifactId>mysql-connector-j</artifactId>
                            <version>8.0.33</version>
                        </artifact>
                        <moduleInfo>
                            <name>mysql.connector.j</name>
                            <exports>com.mysql.cj.jdbc</exports>
                            <provides>java.sql.Driver with com.mysql.cj.jdbc.Driver</provides>
                            <requires>java.sql</requires>
                            <requires>java.naming</requires>
                            <requires>java.xml</requires>
                            <requires>java.logging</requires>
                        </moduleInfo>
                    </module>
                </modules>
            </configuration>
        </execution>
    </executions>
</plugin>
  1. 重新运行mvn jlink:jlink,此时MySQL驱动已成为标准模块化JAR,可被JLink正常处理。

方案3:用jpackage将驱动放到类路径(无需模块化改造)

如果不想处理模块化,可直接用jpackage打包时将MySQL驱动加入类路径:

  1. 先通过JLink生成基础运行时镜像,再配置maven-jpackage-plugin:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jpackage-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jpackage</goal>
            </goals>
            <configuration>
                <module>你的主模块名/你的主类全路径</module>
                <name>你的应用名</name>
                <input>target</input>
                <dest>target/jpackage</dest>
                <runtimeImage>target/jlink-image</runtimeImage>
                <appVersion>1.0</appVersion>
                <!-- 将MySQL驱动JAR加入类路径 -->
                <arguments>--class-path mysql-connector-j-8.0.33.jar</arguments>
            </configuration>
        </execution>
    </executions>
</plugin>

额外注意事项

  • 移除代码中冗余的Class.forName("com.mysql.cj.jdbc.Driver"),JDBC 4.2+会自动通过服务提供者机制加载驱动。
  • 确保JDK版本与MySQL驱动版本兼容(MySQL Connector/J 8.x需JDK 8+)。

内容的提问来源于stack exchange,提问作者Morph3us

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:55:44