【问题标题】:Stand alone jpackage generated java app generates ClassNotFoundException for com.mysql.cj.jdbc.Driver独立 jpackage 生成的 java app 为 com.mysql.cj.jdbc.Driver 生成 ClassNotFoundException
【发布时间】:2022-01-19 17:44:28
【问题描述】:

我用 jpackage 构建了一个 java 应用程序。该应用程序在 eclipseT 中运行。 jpackage 的结果可以安装在 windows 上并启动。该应用程序使用 javafx ui。该应用程序基于 Java 17 和使用模块。到目前为止,一切都很好。该应用程序应该写入 MySQL 数据库并从这里开始问题。 mysql-connector-java-8.0.27.jar 不支持模块,因此不能像 --module-path 下的其他 jar 一样声明。我用 --java-options -Dclasspath=C:\Users\home\mysql-connector-java-8.0.27.jar 来克服。在 app.cfg 文件中,生成了以下条目:java-options=-Dclasspath=C:\Users\home\mysql-connector-java-8.0.27.jar。 在 ConnectDB 类中,我使用 conn = DriverManager.getConnection(DB_JDBC_CONNECT, connectionProps);这适用于 eclipse,但不适用于 jpackage 生成的 java 应用程序。所以我添加了 Class.forName("com.mysql.cj.jdbc.Driver"),但这会引发 ClassNotFoundException! 任何想法如何说服 java 应用程序查看 mysql-connector-java-8.0.27.jar 的 com.mysql.cj.jdbc.Driver?

【问题讨论】:

标签: java jdbc classpath jpackage


【解决方案1】:

Jpackage 现在按预期工作。以下是经验教训:

最终生效的命令如下:

jpackage
--name MyApp
--type msi 
--win-console 
--input ..\lib 
--dest \temp\instMyApp 
--module-path %JAVA_HOME%\jmods;.\myApp.ui.jar;.\myApp.db.jar  
--add-modules myApp.ui,myApp.db,java.logging 
--jlink-options --bind-services 
--module myApp.ui/myApp.ui.EntryForm

也许 --jlink-options 行可以省略或扩展。尚未测试。

最大的区别是线条

 --input ..\lib

对于--input,仅应给出包含非模块化 jar 的目录。在我声明为之前

--input ..\lib\mysql-connector-java-8.0.27.jar

这会在构建 msi 时引发错误,告知对象已存在。

在我尝试通过以下方式声明类路径之前:

java-options=-Dclasspath=C:\Users\home\mysql-connector-java-8.0.27.jar

可以在MayApp.cfg文件中找到声明,但是没有作用!

使用如图所示的 jpackage 命令,全部在一行中,MyApp.cfg 文件中的条目如下所示:

[Application]
app.mainmodule=myApp.greek.ui/myApp.ui.EntryForm
app.classpath=$APPDIR\mysql-connector-java-8.0.27.jar

[JavaOptions]
java-options=-Djpackage.app-version=1.0

补充说明: --win-console 在启动 MyApp.exe 时打开一个控制台。 注意

--add-modules myApp.ui,myApp.db,java.logging

提到 java.logging 的行。

--java-options -Djava.util.logging.config.file=C:\temp\myApp.log

应该可以记录到文件。直到现在才起作用。

在执行 jpackage 命令之前,我在将执行命令的同一目录中构建了两个模块(myApp.db 和 myApp.ui)的 jar。最终,在仅给出模块目录的路径时,可以省略 jar 的构建。待定!

..\lib 目录应仅包含非模块化 jar,如所示 mysql-connector。 其他 jars,如 H2-db-engine 可以放在同一个目录中,以获得更轻量级的 MySQL 版本。

我还尝试在 MANIFEST.MF 中声明类路径。显然可以省略。不考虑。

玩得开心!

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多