JPackage (инкубатор) и проблема с базой данных SQLite
Мне снова нужна была помощь, без идей.:(Я делаю приложение JavaFX, которое будет использовать базу данных SQLite. Используется OpenJDK 14 с OpenJFX14. В моем 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 скопирован JPackage в папку /app. Я попытался вручную скопировать Porez.db в корневую папку, где находится *.exe. Странно, но статусная метка в этом случае не меняется. И он должен, он должен возвращать истину или ложь, этого не понимаю.
Это сценический вид при запуске:
Даже если я переименую файл базы данных в папку /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 и после установки.
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-выпуска проверьте структуру каталогов выпуска.
Убедитесь, что он содержит файл sqllite-jdbc.jar. Если НЕ найден, исправьте
--input
каталоги, чтобы добавить банку.Проверить
app\xxx.cfg
файл для созданного вами приложения. Он должен содержать все ваши зависимости jar, включая sqlite-jdbc.jar, например:app.classpath=$ROOTDIR\app\jars\xxxx.jar;$ROOTDIR\app\jars\sqlite-jdbc.jar
Убедитесь, что команда jlink, которую вы использовали для создания образа среды выполнения
hello\myjre
включает в себя--add-modules java.sql
для объединения с необходимыми зависимостями SQL.Структура приложения, созданная установщиком, который строит 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); } }