JPackage孵化器和SQLite数据库问题

问题描述

出于构想,我可以再次使用一些帮助。 :( 我正在制作将使用sqlite数据库的JavaFX应用程序。使用带有OpenJFX14的OpenJDK 14。在我的Eclipse中,一切运行正常。我尝试通过JPackage进行安装程序测试,该方法也起作用。当我启动已安装的应用程序时,它开始正常,但是由于某种原因拒绝连接数据库

这是我的项目结构:

enter image description here

我有一个按钮,在加载舞台时,我会检查连接。它在文件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,否则无法理解。

这是开始时的舞台外观:

enter image description here

即使我在/ 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中工作毫无意义,安装后也没有。

解决方法

如果使用以下命令运行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);
         }
     }