Java SQLite - невозможно получить доступ к .db-файлу внутри исполняемого файла jar

Файл базы данных, к которому я хочу подключиться, находится по адресу:

\ProjectName\src\resources\database\database.db

Если я свяжу свое приложение в банку, оно будет расположено по адресу:

\ProjectName\target\ProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar\resources\database\database.db

Эта папка находится в

C:\Users\Username\Documents\JavaProjects\

Мой подход в коде:

private static final String CONNECTION = "jdbc:sqlite:" + System.getProperty("user.dir") + "\\ProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar\\resources\\database\\database.db";

try(final Connection connection = DriverManager.getConnection(CONNECTION)) {
    final Statement statement = connection.createStatement();
    statement.setQueryTimeout(10);

    statement.executeUpdate(stmt);

    connection.close();
} catch (SQLException e) {
 //...
}

Если я дважды щелкну файл ProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar, я получу:

path to C:\Users\Username\Documents\JavaProjects\ProjectName\target\ProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar\resources\database\database.db does not exist.

Если я изменю строку подключения на:

private static final String CONNECTION = "jdbc:sqlite::resource\resources\database\database.db";

тогда я получаю:

path to C:\Users\Username\Documents\JavaProjects\ProjectName\target:resource does not exist

Я использую maven с этими зависимостями:

<dependencies>

<dependency>
  <groupId>org.xerial</groupId>
  <artifactId>sqlite-jdbc</artifactId>
  <version>3.7.2</version>
</dependency>

</dependencies>

Как я могу получить доступ к файлу базы данных sqlite внутри файла .jar?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
456
1

Ответы 1

Есть несколько проблем.

Согласно документация префикс для базы данных пути к классам - jdbc:sqlite::resource:. Обратите внимание на точку с запятой после ресурса.

Следующая проблема заключается в том, что вам нужно использовать обычные косые черты (а не обратные косые черты), когда вы указываете путь пакета к файлу внутри jar.

И последняя потенциальная проблема заключается в том, что вам нужно указать правильное имя пакета и файл должен быть упакован в jar. В какой пакет попадают файлы с \ProjectName\src\resources? Не похоже, что вы используете структуру maven по умолчанию. Вы должны поместить файл в projectRoot/src/main/resources/, учитывая, что pom.xml находится в projectRoot. Таким образом, maven поместит файл ресурсов в банку.

Подводя итог, если вы поместите файл в projectRoot/src/main/resources/database/database.db, файл попадет в пакет database.database, и правильный URL-адрес JDBC будет:

jdbc:sqlite::resource:database/database.db

Другие вопросы по теме