JavaFX+Maven项目打包Jar后出现com.mysql.cj.jdbc.Driver类找不到异常
解决JavaFX Maven打包后MySQL驱动找不到的问题
1. 检查MySQL驱动的Maven依赖配置
确保你的MySQL驱动依赖没有设置scope=provided或test,这会导致打包时驱动不被包含。正确的依赖配置示例:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <!-- 使用最新稳定版本 --> </dependency>
2. 修正module-info.java的模块声明
JavaFX是模块化项目,必须在module-info.java中声明对MySQL驱动模块的依赖:
module your.module.name { requires javafx.controls; requires javafx.fxml; requires mysql.connector.j; // MySQL 8.0.23+的模块名为mysql.connector.j,旧版本为mysql.connector.java // 若代码中用反射加载驱动,需添加此行开放对应包 opens your.package.name to mysql.connector.j; }
3. 调整Maven打包插件配置
若使用javafx-maven-plugin打包
需在插件配置中明确包含MySQL驱动模块:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>your.module.name/your.main.class.full.path</mainClass> <launcher>your-app-name</launcher> <modulePaths> <modulePath>${project.build.directory}/modules</modulePath> </modulePaths> <addModules> <addModule>mysql.connector.j</addModule> </addModules> </configuration> <executions> <execution> <id>default-cli</id> <phase>package</phase> <goals> <goal>jlink</goal> </goals> </execution> </executions> </plugin>
若使用maven-shade-plugin打包成可执行Jar
必须添加服务加载器转换器,避免驱动的服务配置丢失:
<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> <!-- 合并服务加载器配置文件,这是关键 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>your.main.class.full.path</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
4. 修正数据库驱动加载方式
JDBC 4.0+支持自动加载驱动,无需手动调用Class.forName("com.mysql.cj.jdbc.Driver"),直接获取连接即可:
String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, user, password);
5. 验证打包内容
打包完成后,检查生成的产物:
- 若为Jar包,解压后查看
BOOT-INF/lib目录是否存在mysql-connector-j-xxx.jar - 若为jlink镜像,查看
modules目录是否包含mysql.connector.j模块
内容的提问来源于stack exchange,提问作者Xiro
相关产品推荐
相关产品推荐

