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

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

\ ProjectName \ SRC \ ресурсы \ базы данных \ database.db

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

\ ProjectName \ цель \ ProjectName-0.0.1-SNAPSHOT-банку-с-dependencies.jar \ ресурсы \ базы данных \ database.db

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

C: \ Users \ Имя пользователя \ 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, я получу:

путь к C: \ Users \ Имя пользователя \ Documents \ JavaProjects \ ProjectName \ цель \ Projectname-0.0.1-SNAPSHOT-банку-с-dependencies.jar \ Resources \ базы данных \ database.db не существует.

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

private static final String CONNECTION = "JDBC: SQLite :: ресурс \ ресурсы \ базы данных \ database.db";

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

путь к C: \ Users \ Имя пользователя \ Documents \ JavaProjects \ ProjectName \ цель: ресурс не существует

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

<dependencies>

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

</dependencies>

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

1 Ответ

0 голосов
/ 30 августа 2018

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

Согласно документации префикс для базы данных classpath равен 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
...