Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JAR文件中包含的应用程序访问H2数据库_Java_H2 - Fatal编程技术网

Java 从JAR文件中包含的应用程序访问H2数据库

Java 从JAR文件中包含的应用程序访问H2数据库,java,h2,Java,H2,我有一个使用H2数据库和以下连接字符串的应用程序: Connection connection = DriverManager.getConnection("jdbc:h2:file:data/sample", "sa", ""); 它在Eclipse下运行得非常好,但是如果我将Java桌面应用程序打包到JAR文件中,它将无法在data/sample中找到H2数据库。以下是正在运行的目录: application.jar data | sample.h2.db 下面是我如何尝试执行

我有一个使用H2数据库和以下连接字符串的应用程序:

Connection connection = DriverManager.getConnection("jdbc:h2:file:data/sample", "sa", "");
它在Eclipse下运行得非常好,但是如果我将Java桌面应用程序打包到JAR文件中,它将无法在data/sample中找到H2数据库。以下是正在运行的目录:

application.jar
data |
     sample.h2.db
下面是我如何尝试执行应用程序:

java -classpath .; -jar application.jar
由于未找到任何表,因此引发SQLException。有没有任何提示可以让我的连接运行到Eclipse和JAR文件中

请注意,根据要求,我不应该为数据库使用绝对路径,而应该使用相对路径,因为应用程序安装程序会将数据库文件夹与jar文件一起解压缩。

我可以考虑一些可能的错误原因:

  • 数据库是空的。在eclipse下构建应用程序时,您可能已经填充了它,但是当从jar文件启动时,您遇到了一个空的:使用H2控制台控制它,如果数据库是空的,则在启动时填充数据库,或者将一个完全初始化的数据库与jar放在一起
  • 当您给出数据库的相对路径时,实际路径取决于当前工作目录。这很不寻常,而且容易出错。您最好给出一个绝对路径,该路径可以在环境变量或java系统属性中找到:它仍然是可配置的,但更显式

对于第二种可能性,如果H2没有找到它,它会自动创建一个新的数据库。为了避免路径错误时自动创建,可以添加
;IFEXISTS=TRUE
指向url:
“jdbc:h2:file:data/sample;IFEXISTS=TRUE”
。但是,如果可以,请避免使用相对路径…

您可以发布stacktrace吗?在您的类路径中,我没有看到
h2.jar
。谢谢,我发现我第一次启动应用程序时在类路径中犯了一个错误。因此,发生的情况是数据库文件被覆盖(重新创建)。我将向路径中添加IFEXISTS=TRUE参数