JPackage(孵化器)和SQLite数据库问题
JPackage (incubator) and SQLite database problem
出于想法,我可以再次使用一些帮助。 :(
我正在制作将使用 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) ? "Веза са базом успостављена" : "Повезивање са базом није успело.";
}
如果为真,return用我的语言显示“已建立数据库连接”,如果为假,则为“与数据库的连接失败”。
我再说一遍,在 Eclipse 中一切正常。但是,当开始安装的应用程序时,我收到“与数据库的连接失败”。因此连接 return 由于某种原因无效。
我的数据库文件被 JPackage 复制到 /app 文件夹中。我试图将手动 Porez.db 复制到 *.exe 所在的根文件夹。奇怪的是,在这种情况下状态标签不会改变。而且应该的,一定return是真还是假,没看懂
这是开始时的舞台造型:
即使我重命名 /app 文件夹中的数据库文件,所以找不到我的连接仍然 returning 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 版本后,检查版本目录结构。
确保它包含 sqllite-jdbc.jar 文件。
如果找不到,请修复您的 --input
目录以添加 jar。
检查您生成的应用程序的 app\xxx.cfg
文件。
它必须包含您所有的 jar 依赖项,包括 sqlite-jdbc.jar,例如:
app.classpath=$ROOTDIR\app\jars\xxxx.jar;$ROOTDIR\app\jars\sqlite-jdbc.jar
检查您用于构建运行时映像 hello\myjre
的 jlink 命令是否包含 --add-modules java.sql
以与所需的 SQL 依赖项结合。
jpackage 构建的安装程序创建的应用程序结构与您在 Eclipse 中的结构不同 - 文件位于 app
目录下,最重要的是发布只能由管理员编辑特权。使用System属性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);
}
}
出于想法,我可以再次使用一些帮助。 :( 我正在制作将使用 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) ? "Веза са базом успостављена" : "Повезивање са базом није успело.";
}
如果为真,return用我的语言显示“已建立数据库连接”,如果为假,则为“与数据库的连接失败”。
我再说一遍,在 Eclipse 中一切正常。但是,当开始安装的应用程序时,我收到“与数据库的连接失败”。因此连接 return 由于某种原因无效。
我的数据库文件被 JPackage 复制到 /app 文件夹中。我试图将手动 Porez.db 复制到 *.exe 所在的根文件夹。奇怪的是,在这种情况下状态标签不会改变。而且应该的,一定return是真还是假,没看懂
这是开始时的舞台造型:
即使我重命名 /app 文件夹中的数据库文件,所以找不到我的连接仍然 returning 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 版本后,检查版本目录结构。
确保它包含 sqllite-jdbc.jar 文件。 如果找不到,请修复您的
--input
目录以添加 jar。检查您生成的应用程序的
app\xxx.cfg
文件。 它必须包含您所有的 jar 依赖项,包括 sqlite-jdbc.jar,例如:app.classpath=$ROOTDIR\app\jars\xxxx.jar;$ROOTDIR\app\jars\sqlite-jdbc.jar
检查您用于构建运行时映像
hello\myjre
的 jlink 命令是否包含--add-modules java.sql
以与所需的 SQL 依赖项结合。jpackage 构建的安装程序创建的应用程序结构与您在 Eclipse 中的结构不同 - 文件位于
app
目录下,最重要的是发布只能由管理员编辑特权。使用System属性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); } }