我要求使用create / insert语句创建一次数据库,然后使用只读数据库访问权限将其设置为在javafx runnable jar 中。
我刚刚浏览了H2数据库文档并尝试使用H2 Driver version 1.4.196 and 1.4.192
来实现这一点,但我想我错过了一些东西。
我可以连接而不将其包含在runnable jar中,只读内容也可以。但我需要从jar本身访问它以防止外部人员访问数据库。
我可以连接字符串或逻辑来连接jar本身的只读DB文件吗?
更明确的实际例子我已经将压缩逻辑实现为this,并且它在给定路径下工作正常。
但是当我在runnable jar中添加zip文件并通过以下代码访问它时:
DriverManager.getConnection("jdbc:h2:file:split:zip:./test.zip!/test");
然后它抛出异常:
Exception in thread "main" org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: .\jar\res\buzdirectory.zip (The system cannot find the path specified)"; "listFiles zip:./jar/res/buzdirectory.zip!/" [90031-196]
如果我放置完全合格的路径,那么效果很好:
DriverManager.getConnection("jdbc:h2:file:split:zip:C:\\CoreJava\\src\\main\\java\\res\\test.zip!/test");
我在这里缺少从jar文件中访问它。
答案 0 :(得分:0)
我认为我们无法直接从可运行的JAR文件中打开数据库文件。要访问它应该是一个“真正的”文件,所以我们需要从JAR中提取它,然后打开该副本。
例如,要将数据库从JAR提取到临时文件中:
File dbFile = File.createTempFile("temp", ".zip");
dbFile.deleteOnExit();
java.nio.file.Files.copy(this.getClass().getResourceAsStream("/db/temp.zip"),
dbFile.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
StringBuffer connStr = new StringBuffer("jdbc:h2:file:split:zip:")
.append(dbFile.getAbsolutePath()).append("!/temp");
Connection conn = DriverManager.getConnection(connStr.toString());
conn.close();
System.out.println("closed");
顺便说一下,这不是一个更好的方法。但是我们可以在某些特殊情况下使用这种方法。