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-выпуска проверьте структуру каталогов выпуска.

  1. Убедитесь, что он содержит файл sqllite-jdbc.jar. Если НЕ найден, исправьте--input каталоги, чтобы добавить банку.

  2. Проверить app\xxx.cfgфайл для созданного вами приложения. Он должен содержать все ваши зависимости jar, включая sqlite-jdbc.jar, например:

    app.classpath=$ROOTDIR\app\jars\xxxx.jar;$ROOTDIR\app\jars\sqlite-jdbc.jar
    
  3. Убедитесь, что команда jlink, которую вы использовали для создания образа среды выполнения hello\myjre включает в себя --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);
         }
     }
    
Другие вопросы по тегам