基本上,当我在eclipse上运行我的模块化项目时,它工作得很好,但是当我使用jlink创建运行时映像时,它会抛出一个mysql连接错误。
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/timp_db
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:708)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
at projectTMIP/database.DBConnect.getConnection(DBConnect.java:14)
... 56 more
这是我的module-info.java看起来像
module projectTMIP {
requires javafx.controls;
requires java.sql;
requires javafx.fxml;
requires javafx.graphics;
opens model to javafx.graphics, javafx.fxml;
opens controller to javafx.fxml;
exports controller;
requires transitive javafx.base;
}
这是我在我的根项目上导航的eclipse终端上使用的命令。
jlink --module-path "path/to/jmod";"path/to/mysql/connector.jar";bin --add-modules projectTMIP --output output/image --launcher run=projectTMIP/model.Main
我希望生成一个运行时映像,其中包含mysqlconnector.jar
1条答案
按热度按时间wmomyfyw1#
***警告:*使用
jpackage
工具可能会使部署应用程序变得更加复杂,因为该工具只能为其执行的操作系统创建可执行文件/安装程序。jlink
工具只适用于 explicit 模块。换句话说,模块必须有一个module-info
描述符。因此,您不能在运行时映像中包含MySQL JDBC驱动程序,因为该库不是模块化的。您可以尝试“破解”依赖项以使其模块化,但这可能很困难并且容易出错。也就是说,
jpackage
工具可以处理模块化和非模块化应用程序。这在这种情况下很重要,因为JDBC驱动程序是服务提供者,这意味着命名模块可以通过服务加载器机制加载它们,即使提供者位于未命名模块中。为了在代码中包含MySQL JDBC驱动程序,配置jpackage
将所有需要的显式模块放在自定义运行时映像中(它在幕后使用jlink
),然后通过--input
选项将驱动程序放在类路径上。示例
这里有一个非常基本的例子来展示我上面描述的内容。请注意,本示例中的所有工具调用都是直接在命令行上执行的,而不是通过IDE或构建工具执行的。
该示例不包括JavaFX,因为它对所演示的内容并不重要。
源码
模块信息:
示例.主:
项目布局
创建可执行文件
首先编译项目:
然后打包应用程序:
几点注意事项:
1.我包含了
--win-console
,因为我想在运行可执行文件时看到控制台输出(我使用的是Windows)。1.我包含
--add-modules java.naming
是因为MySQL JDBC驱动程序似乎需要该模块才能运行。您可能会发现需要包含或不需要包含更多模块;如果需要,只需将它们添加到--add-modules
参数中,或者,如果更有意义,将适当的requires
指令添加到代码的module-info描述符中。运行Executable
我目前没有一个MySQL服务器可用于测试,所以下面显示的输出是一个异常堆栈跟踪。但是如果您查看异常,您会看到错误是无法建立连接。这一事实,加上堆栈跟踪中显示的MySQL JDBC驱动程序代码,表明MySQL JDBC驱动程序已成功找到。
命令(Windows):
输出(没有运行MySQL服务器):
应用布局
下面是由上面的
jpackage
命令生成的应用程序的布局: