Как упаковать базу данных SQLite в банку?

У меня есть проект Java, в котором используется небольшая база данных SQLite.

Теперь я хочу создать исполняемый файл jar с файлом базы данных и драйвером (sqlitejdbc-v056) внутри, чтобы иметь единый, все содержащий пакет.

Структура моего пакета выглядит так:

Bank
|
| 
+---src
|   ...
|           
+---bin
|   ...
|           
+---data
|       bank_database.db
|       
+---img
|       ajax-refresh-icon.gif
|       
+---doc
|       Datenbankschema.uxf
|       
\---resources
        sqlitejdbc-v056.jar

Я обращаюсь к БД с помощью этого небольшого класса Java:

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBHandle {

    Connection conn;

    public DBHandle() throws Exception {
        Class.forName("org.sqlite.JDBC");
    }

    public Connection openConnection() throws SQLException {
        conn = DriverManager.getConnection("jdbc:sqlite:data\\bank_database.db");
        return conn;
    }

    public void closeConnection() throws SQLException {
        if (!conn.isClosed()) {
            conn.close();
        }

    }

}

Если я упакую все это в банку с менеджером экспорта Eclipse и попытаюсь выполнить его, он выдаст ClassNotFoundException для драйвера JDBC.

Как я могу решить эту проблему?

Возможно ли вообще изменить ресурсы в банке относительно базы данных?


person Demnogonis    schedule 02.12.2011    source источник
comment
Если вы поместите файл базы данных в банку, вы не сможете обновить его во время выполнения - вы знаете об этом?   -  person Thomas    schedule 02.12.2011
comment
Нет, не :-/ ... Похоже, мне нужно пересмотреть свою концепцию   -  person Demnogonis    schedule 02.12.2011


Ответы (3)


Насколько я знаю, вы не можете без особых хлопот изменять ресурсы внутри jar (в основном это zip, и поэтому это должно быть возможно, но JVM может блокировать файлы и т. д.).

Кроме того, вы не можете положить одну банку в другую. Однако вы можете распаковать банку драйвера и включить содержимое в свою банку, если хотите. Плагин сборки Maven имеет следующую цель: jar-with-dependencies.

person Thomas    schedule 02.12.2011
comment
Кроме того, вы не можете положить одну банку в другую. - вы должны взглянуть на onejar (one-jar.sourceforge.net) - person smp7d; 02.12.2011
comment
@ smp7d Интересно, я не знал об этом. Спасибо, что поделился. - person Thomas; 03.12.2011

Чтобы решить вашу ClassNotFoundException, вам нужно добавить банку sqllite в путь к классам.

см.: http://docs.oracle.com/javase/6/docs/technotes/tools/windows/classpath.html

person smp7d    schedule 02.12.2011
comment
Я думаю, что вопрос не в SQLite engine jar. По крайней мере, одна часть этого вопроса касается bank_database.db - person Alex K; 02.12.2011
comment
Да, я добавил драйвер в путь к классам в файле манифеста. Но теперь он не может найти базу данных. Он ищет в обычном пути к файлу. Должен ли я также добавлять файл базы данных в манифест? - person Demnogonis; 02.12.2011

Я предпочитаю использовать утилиту под названием one jar. Вы можете использовать вызов из ant или maven, и я использую его как для работы, так и для своих личных проектов. У меня есть достойная статья в блоге, в которой объясняется, как ее использовать: Создание автономных исполняемых файлов JAR 2 способами

person Chris J    schedule 02.12.2011