【问题标题】:add sqlite DB to executable JAR file将 sqlite DB 添加到可执行 JAR 文件
【发布时间】:2013-02-17 16:25:27
【问题描述】:

我正在使用 JAVA(带有 eclipse juno)并尝试创建一个包含 sqlite DB 文件的可执行 JAR 文件。 我尝试通过这一行连接到数据库:

DriverManager.getConnection("jdbc:sqlite:"+DataController.class.getResource("test.sqlite").getPath())

DataController 是一个位于 sqlite 所在位置的类。

我一直收到错误:

java.sql.SQLException: invalid database address

有人可以帮助并逐步说明如何将 sqlite DB 包含在可执行 JAR 文件中吗?

【问题讨论】:

  • 当给定的数据库 URL 无效时会发生此错误。尝试打印出你给getConnection()的字符串
  • 我已经打印出来了,这是到 sqlite DB 的确切路径。

标签: java eclipse jdbc


【解决方案1】:

显然 sqlite-jdbc 可以自己打开资源。根据这个线程https://groups.google.com/forum/?fromgroups=#!topic/xerial/Oayzj5nrJGk,将 :resource 添加到路径中。所以尝试以下方法:

DriverManager.getConnection("jdbc:sqlite::resource:package/test.sqlite"); 

或取决于 sqlite 的版本

DriverManager.getConnection("jdbc:sqlite::resource:package/test.db"); 

将包替换为该文件所在包的“/”分隔路径。

请注意,它实际上会将文件复制到 tmp 目录。-

【讨论】:

  • 我使用 jdbc:sqlite::resource 读到:数据库是只读的。
  • 如果您的数据库(如我的)只是在项目的 resources 目录中,那么以下连接字符串就足够了:jdbc:sqlite::resource:test.sqlitejdbc:sqlite::resource:test.db 取决于您的SQLite 版本。我花了太多时间试图弄清楚这一点。 resource 添加到 URI 是它工作的原因,因为没有它,驱动程序假定您的数据库与连接到它的文件位于同一目录中。
  • 我遵循这个并得到一个异常 java.sql.SQLException: resource quanlythuchi3.sqlite not found: java.net.MalformedURLException: no protocol: MyDB.sqlite
  • @Chris Cirefice 非常感谢您的评论。你的建议对我有用。
  • 非常感谢@Chris Cirefice .. 我面临着完全相同的异常,您的评论让我很开心... :)
【解决方案2】:

::resource 的方式是正确的。如果您使用的是::resource,但这些解释会有所帮助,但仍然会遇到像resource database.db not found: java.net.MalformedURLException: no protocol: database.db 这样的错误,比如verdana。

最常见的答案是: DriverManager.getConnection("jdbc:sqlite::resource:path/to/database.db")

但是,path/to/database.db 必须是您的 jar 文件的确切路径(真实文件系统中的路径,而不是 Jar 中的路径)。

我推荐使用getClass().getResource():

DriverManager.getConnection("jdbc:sqlite::resource:" + 
        getClass().getResource("/path/to/db/in/the/jar/file"))

注意/path/to/db/in/the/jar/file部分必须以/开头

【讨论】:

    【解决方案3】:

    我不确定这在最近的 JDBC 版本中是否发生了变化,但是在摆弄了大约一个小时并遇到各种异常(MalformedURLException 和“数据库已关闭”)后,我发现以下内容对我有用:

    DriverManager.getConnection("jdbc:sqlite::resource:file:/path/to/database.db")
    

    :file: 部分似乎从其他答案中丢失,没有它我无法让它工作。

    另外,请注意

    /path/to/database.db
    

    是从 .jar 文件的根目录开始的绝对路径,而不是普通的资源根目录。

    【讨论】:

      【解决方案4】:
      jdbc:sqlite::resource:notes_app.db
      

      为我工作。我的数据库(notes_app.db)位于生成的 jar 文件的根目录中。

      public class Database {
          public static Connection con () throws SQLException {
              String url = "jdbc:sqlite::resource:notes_app.db";
              return DriverManager.getConnection(url);
          }
      }
      

      我的 notes_app.db 位于生成的 jar 的根目录中。我正在使用 ma​​vennotepadd++

      进行开发

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多