如何解决MSSQL JDBC Driver无法创建自定义Runtime Image的问题
解决jlink无法使用自动模块com.microsoft.sqlserver.jdbc的问题
问题原因
jlink工具仅支持显式模块(包含module-info.class的模块化jar包),而你使用的mssql-jdbc属于自动模块(未定义module-info.class,仅通过jar文件名识别模块名),因此jlink无法将其纳入自定义Runtime Image,触发报错。
解决方案一:改用jpackage打包(推荐)
jpackage工具支持自动模块,可直接替代jlink生成包含所有依赖的Runtime Image或安装包。修改pom.xml中的JavaFX Maven插件配置:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <executions> <execution> <id>default-cli</id> <configuration> <mainClass>com.example.demo/com.example.demo.HelloApplication</mainClass> <launcher>app</launcher> <!-- 移除原有jlink配置,添加jpackage相关设置 --> <jpackage>true</jpackage> <jpackageImageName>app</jpackageImageName> <jpackageInstallerName>app-installer</jpackageInstallerName> </configuration> </execution> </executions> </plugin>
执行打包命令:
mvn clean javafx:jpackage
执行完成后,会在target目录下生成可执行的Runtime Image和安装包。
解决方案二:将自动模块转换为显式模块
通过工具给mssql-jdbc jar添加module-info.class,使其成为jlink支持的显式模块。
手动转换步骤:
- 定位本地Maven仓库中的
mssql-jdbcjar:C:/Users/artyukhev/.m2/repository/com/microsoft/sqlserver/mssql-jdbc/11.2.3.jre17/mssql-jdbc-11.2.3.jre17.jar - 生成模块信息:
jdeps --generate-module-info . mssql-jdbc-11.2.3.jre17.jar
- 编译生成的
module-info.java:
javac --patch-module com.microsoft.sqlserver.jdbc=./mssql-jdbc-11.2.3.jre17.jar com.microsoft.sqlserver.jdbc/module-info.java
- 将编译后的
module-info.class加入原jar:
jar uf mssql-jdbc-11.2.3.jre17.jar -C com.microsoft.sqlserver.jdbc module-info.class
- 将修改后的jar放回原Maven仓库路径,覆盖原文件。
之后重新执行jlink命令即可:
mvn clean javafx:jlink
解决方案三:用Moditect插件自动生成模块信息
通过moditect-maven-plugin在构建过程中自动为mssql-jdbc生成并添加module-info.class,无需手动修改jar包。
在pom.xml的<build><plugins>中添加插件配置:
<plugin> <groupId>org.moditect</groupId> <artifactId>moditect-maven-plugin</artifactId> <version>1.0.0.Final</version> <executions> <execution> <id>add-module-info</id> <phase>package</phase> <goals> <goal>add-module-info</goal> </goals> <configuration> <modules> <module> <artifact> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>11.2.3.jre17</version> </artifact> <moduleInfo> <name>com.microsoft.sqlserver.jdbc</name> <requires>java.sql</requires> <requires>java.naming</requires> <requires>java.xml</requires> <exports>com.microsoft.sqlserver.jdbc</exports> <exports>com.microsoft.sqlserver.jdbc.datatypes</exports> <!-- 可根据jdeps生成的结果补充其他exports/requires --> </moduleInfo> </module> </modules> </configuration> </execution> </executions> </plugin>
执行命令完成构建和jlink:
mvn clean package javafx:jlink
内容的提问来源于stack exchange,提问作者Edward Northwind
相关产品推荐
相关产品推荐

