【问题标题】:JPackage (incubator) and SQLite database problemJPackage(孵化器)和SQLite数据库问题
【发布时间】:2020-08-23 19:47:08
【问题描述】:

我可以再次使用一些帮助,没有想法。 :( 我正在制作将使用 SQLite 数据库的 JavaFX 应用程序。使用带有 OpenJFX14 的 OpenJDK 14。在我的 Eclipse 中,一切都运行良好。我尝试测试以使用 JPackage 制作安装程序,这也有效。当我启动安装的应用程序时,它启动正常,但由于某种原因拒绝连接数据库。

这是我的项目结构:

我有一个按钮,在加载 Stage 时我会检查连接。它在 PocetnaController 文件中:

    //testiranje konekcije nakon instalacije
@FXML
public void btnObracunClick(ActionEvent event) {
    lblStatus.setText(model.povezanaBaza());
}

这是来自 PocetnaModel 的代码:

    public String povezanaBaza() {
    this.konekcija = Konekcija.poveziBazu();
    return (this.konekcija != null) ? "Веза са базом успостављена" : "Повезивање са базом није успело.";
}

如果为 true,它会以我的语言返回“已建立数据库连接”,如果为 false,则返回“与数据库的连接失败”。

我再说一遍,在 Eclipse 中一切正常。但是,当启动安装的应用程序时,我得到“与数据库的连接失败”。所以连接由于某种原因返回 null。

我的 db 文件由 /app 文件夹中的 JPackage 复制。我试图手动将 Porez.db 复制到 *.exe 所在的根文件夹。奇怪的是,在这种情况下状态标签不会改变。而且应该,它必须返回true或false,不明白。

这是开始时的舞台外观:

即使我重命名 /app 文件夹中的数据库文件,所以找不到我的连接仍然返回 false 并相应地更新状态,这没关系。

这是负责连接的整个 Konekcija 文件:

    public static Connection poveziBazu() {
    File baza = new File("Porez.db");
    try {
        if (baza.exists()) {
            Connection con = DriverManager.getConnection("jdbc:sqlite:Porez.db");
            return con;
        } else {
            return null;
        }
    } catch (Exception e) {
        return null;
    }
}

我的第一个怀疑是我创建的 JAR 有问题,但不能确定。在 Eclipse 中工作对我来说毫无意义,安装后也没有。

【问题讨论】:

  • 您的应用程序中不能有您的数据库文件。

标签: java javafx jar jpackage


【解决方案1】:

如果您使用以下方式运行 jpackage,您需要检查并可能修复几个地方:

 jpackage --name SQLiteTest --input C:\Users\Dalibor\Documents\NetBeansProjects\SQLiteTest\dist --main-jar SQLiteTest.jar --runtime-image hello\myjre

打开 Windows 控制台,以便您可以看到它提供的错误消息 - 使用 jpackage --win-console

安装 jpackaged 版本后,检查版本目录结构。

  1. 确保它包含 sqllite-jdbc.jar 文件。 如果未找到,请修复您的 --input 目录以添加 jar。

  2. 检查您生成的应用程序的app\xxx.cfg 文件。 它必须包含所有 jar 依赖项,包括 sqlite-jdbc.jar,例如:

    app.classpath=$ROOTDIR\app\jars\xxxx.jar;$ROOTDIR\app\jars\sqlite-jdbc.jar
    
  3. 检查您用于构建运行时映像 hello\myjre 的 jlink 命令是否包含 --add-modules java.sql 以结合所需的 SQL 依赖项。

  4. 由 jpackage 构建的安装程序创建的应用程序结构与您在 Eclipse 中的结构不同 - 文件位于 app 目录下,最重要的是,该版本只能以管理员权限编辑。使用系统属性java.launcher.path 将 SqlLite 数据库的位置调整为可编辑位置 并且不要掩盖异常:

     public static Connection poveziBazu() {
         File baza = new File("Porez.db");
         String jhome = System.getProperty("java.launcher.path");
         if (jhome != null) {
             baza = new File(System.getProperty("user.home"), "Porez.db");
         }
         System.out.println("Connecting to "+baza.getAbsolutePath()+" exists()="+baza.exists());
         try {
             return DriverManager.getConnection("jdbc:sqlite:"+baza.getAbsolutePath());
         } catch (Exception e) {
             System.out.println("Failed connecting to: "+baza);
             throw new RuntimeException("Failed to open or create db: "+baza, e);
         }
     }
    

【讨论】:

  • 感谢您的努力,但我没有设法让它运行,所以我尝试了简化版本。没有 MVC,只需使用 Button 和 Label 尝试在按钮单击时设置连接。似乎有问题。 ibb.co/dJbv1ZZ舞台加载,点击按钮后没有变化。
  • 即使我将 test.db 设置为像 C://test.db 这样的绝对路径也会发生同样的情况。我不明白。 :(
  • 打印什么异常或消息?还要检查您是否在 jpackage 或 jlink 运行时中包含了 SqlLite jar。
  • 没有消息返回。标签根本没有改变,什么都没有。我不知道如何在 jlink 中包含 sqlite jar,但我将它放在与项目 jar 相同的位置,并将其复制到 Program Files 的 app 文件夹中。这是我的 jpackage 字符串: jpackage --name SQLiteTest --input C:\Users\Dalibor\Documents\NetBeansProjects\SQLiteTest\dist --main-jar SQLiteTest.jar --runtime-image hello\myjre
  • 您的问题是您没有将sqllite打包到生成的图像中,因此在启动生成的EXE时不会加载驱动程序类。我会修改我的答案。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2014-07-11
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多