如何在可执行的Jar中包含SQLite数据库?

时间:2012-08-18 15:52:59

标签: java swing sqlite executable-jar

我创建了一个使用SQLite作为本地数据库的Swing应用程序。数据库文件位于项目的根目录中。

Project/DatabaseFile

应用程序在Eclipse上运行正常,但是当我运行打包的可执行文件Jar时,我收到以下错误:

No such table : table1

这意味着无法访问数据库。当我检查生成的JAR文件的内容时,数据库文件不再存在。

在代码中,我按如下方式链接了数据库:

jdbc:sqlite:DatabaseFile

我的问题是,如何将SQLite数据库包含在可执行文件Jar中?

修改

当我将数据库文件放在源文件夹Project/src/DatabaseFile中并将路径更改为jdbc:sqlite:src/DatabaseFile时,它在Eclipse上运行,但在运行Jar文件java -jar Project.jar时再次运行。它说:

path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist

我想我需要指定数据库的相对路径。

修改

这就是我连接数据库的方式:

public Connection getConnection(){      
    try{
        Class.forName("org.sqlite.JDBC").newInstance();             
        con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");              

    } catch (Exception e) {
        Log.fatal("Méthode: getConnection() | Class  : SQLiteConnection | msg system : " + e.getMessage());
    }
    return con;
}

3 个答案:

答案 0 :(得分:36)

您使用的SQLite库是什么?

我根据您指定的连接URI进行了搜索,找到了this one。在documentation中它说:

  

2009年5月19日:sqlite-jdbc-3.6.14.1发布。此版本支持“jdbc:sqlite :: resource:”语法,以访问JAR归档中包含的只读DB文件,或通过URL,本地文件地址等指定的外部资源(另请参阅detailes

如果那是您正在使用的驱动程序,那么我建议使用以下连接URI:

"jdbc:sqlite::resource:DatabaseFile"

关键是,由于您的数据库位于jar文件中,因此无法作为FileInputStream的文件进行访问。相反,它必须通过JVM对它的支持来访问(即使用Class.getResource()Class.getResourceAsStream())。请注意,jar文件中包含的资源是只读的。您将无法保存对数据库的任何更改。

答案 1 :(得分:3)

我找到了两种不同的方法来命名文件路径,具体取决于您尝试访问它的方式。假设你正在访问数据库位于/ yourproject / resource /或/ yourproject / bin / resource(没有缩小它,我的两个都很好,我很满意)你应该用它作为你的路径:

//Eclipse test path
String url = "jdbc:sqlite:resource/mydb.db";

//runnable jar path
String url = "jdbc:sqlite::resource:mydb.db";

然后

mysqlitedatasource.setUrl(url);

你的方式也可行......把db放在/ src

答案 2 :(得分:-1)

我找到了解决方案。你应该在连接后在数据库中创建表。 在你的课堂上有这样的连接。

 public void createDb() throws SQLException {
        Statement statement = connection.createStatement();
        PreparedStatement preparedStatement = connection.prepareStatement("CREATE TABLE IF NOT EXISTS threads `your table`;    
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

因为当程序在jar中编译时,它不会自动在数据库中创建表。

首先,你必须获得连接并创建一个表,如果不存在这样:

 Connect connect = new Connect();
        connect.getConnection();
        connect.createDb();
        connect.closeConnection();