Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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 战争中资源中的HSQLDB_Java_Maven_Spring Boot_Properties_Hsqldb - Fatal编程技术网

Java 战争中资源中的HSQLDB

Java 战争中资源中的HSQLDB,java,maven,spring-boot,properties,hsqldb,Java,Maven,Spring Boot,Properties,Hsqldb,我已经使用SpringBoot开发了一个小应用程序,目前它使用HSQLDB作为数据库来存储用户。我要做的是将数据库存储在Maven的资源文件夹中。My application.properties文件包含以下配置: #... spring.datasource.url=jdbc:hsqldb:file:src/main/resources/database/dashboard #... 因此,每当我用Java启动应用程序时(右键单击我的应用程序的main()并作为Spring Boot应用程序

我已经使用SpringBoot开发了一个小应用程序,目前它使用HSQLDB作为数据库来存储用户。我要做的是将数据库存储在Maven的资源文件夹中。My application.properties文件包含以下配置:

#...
spring.datasource.url=jdbc:hsqldb:file:src/main/resources/database/dashboard
#...
因此,每当我用Java启动应用程序时(右键单击我的应用程序的main()并作为Spring Boot应用程序运行),数据库都会正确存储

但是,在使用
mvn clean install spring boot:repackage打包WAR文件、将其部署到Tomcat中并运行它之后,数据库不会存储在已分解的WAR中

我的问题是如何告诉
spring.datasource.url=jdbc:hsqldb:file::
property将数据库存储在Maven Resources目录中(战争爆发后仍然指向该目录)?我可以使用pom.xml中使用的某种环境变量吗

编辑
根据@Steve C和@fredt的回答,我意识到数据库不应该存储在战争中。相反,我将把它存储在用户的Home dir
spring.datasource.url=jdbc:hsqldb:file:~/tomcat\u webapp\u data/dashboard/database
。。非常感谢你

WAR文件的目录和内容是只读的

在将其包括在WAR中之前,可以在HSQLDB database.properties文件中设置只读标志。您可以使用
jdbc:hsqldb:res:
URL访问此类数据库

如果要将数据存储在持久性和可更新的数据库中,请连接到应用程序中的(最初不存在的)数据库,并设置其表(如果这些表还不存在,且包含来自资源的数据)。然后可以存储数据。数据库路径应该位于用于JAR和资源的目录之外

与其中一条注释相反,HSQLDB不仅限于在内存中存储数据,还可以具有基于磁盘的表,称为缓存表

您可以在数据库URL中包含一个变量,以从web服务器获取预定义属性。例如:

jdbc:hsqldb:file:${mydbpath}

请参见WAR文件的目录和内容是只读的

在将其包括在WAR中之前,可以在HSQLDB database.properties文件中设置只读标志。您可以使用
jdbc:hsqldb:res:
URL访问此类数据库

如果要将数据存储在持久性和可更新的数据库中,请连接到应用程序中的(最初不存在的)数据库,并设置其表(如果这些表还不存在,且包含来自资源的数据)。然后可以存储数据。数据库路径应该位于用于JAR和资源的目录之外

与其中一条注释相反,HSQLDB不仅限于在内存中存储数据,还可以具有基于磁盘的表,称为缓存表

您可以在数据库URL中包含一个变量,以从web服务器获取预定义属性。例如:

jdbc:hsqldb:file:${mydbpath}

请参阅Maven的
src/main/resources
目录是一个构建时路径,而不是运行时路径

如果您正在构建一个jar文件,那么
src/main/resources
中的所有内容都会复制到jar的根目录中

如果您正在构建war文件,那么
src/main/resources
中的所有内容都将复制到war中/WEB-INF/classes目录的根目录中

现在,您的JDBCURL
JDBC:hsqldb:file:src/main/resources/database/dashboard
指示一个具有相对路径的文件。在运行时,此路径是相对于当前工作目录的,并且在运行时它不太可能存在

如果您真的想在WAR中构建数据库,请提供:

  • 您正在部署一个分解的WAR文件(不可能写入WAR文件本身的内容)

  • 你真的很想把数据库存储在爆炸的战争中

  • 您希望将其放入
    WEB-INF/database/dashboard
    (如果存储在WEB-INF目录之外,则存在安全隐患)

然后,您可以使用以下方法计算JDBC url:

...
String databaseDirectoryName = servletContext.getRealPath("WEB-INF/database");
File databaseDirectory = new File(databaseDirectoryName);
if (!databaseDirectory.exists()) {
    if (!databaseDirectory.mkdirs()) {
        throw new RuntimeException("Failed to create database directory");
    }
}
File databaseFile = new File(databaseDirectory, "dashboard");
String jdbcURL = "jdbc:hsqldb:" + databaseFile.toURI();
...

将其纳入Spring配置是一项训练;但是使用
@Configuration
@Bean
可以做到这一点——您只需要在Spring配置时访问
servletContext

Maven的
src/main/resources
目录是构建时路径,而不是运行时路径

如果您正在构建一个jar文件,那么
src/main/resources
中的所有内容都会复制到jar的根目录中

如果您正在构建war文件,那么
src/main/resources
中的所有内容都将复制到war中/WEB-INF/classes目录的根目录中

现在,您的JDBCURL
JDBC:hsqldb:file:src/main/resources/database/dashboard
指示一个具有相对路径的文件。在运行时,此路径是相对于当前工作目录的,并且在运行时它不太可能存在

如果您真的想在WAR中构建数据库,请提供:

  • 您正在部署一个分解的WAR文件(不可能写入WAR文件本身的内容)

  • 你真的很想把数据库存储在爆炸的战争中

  • 您希望将其放入
    WEB-INF/database/dashboard
    (如果存储在WEB-INF目录之外,则存在安全隐患)

然后,您可以使用以下方法计算JDBC url:

...
String databaseDirectoryName = servletContext.getRealPath("WEB-INF/database");
File databaseDirectory = new File(databaseDirectoryName);
if (!databaseDirectory.exists()) {
    if (!databaseDirectory.mkdirs()) {
        throw new RuntimeException("Failed to create database directory");
    }
}
File databaseFile = new File(databaseDirectory, "dashboard");
String jdbcURL = "jdbc:hsqldb:" + databaseFile.toURI();
...

将其纳入Spring配置是一项训练;但是使用
@Configuration
@Bean
作为一种实现方法,您只需要在Spring配置时访问
servletContext

您似乎在使用相对路径指向hsqldb。Hsql的文件位置将相对于工作目录(可能是bin/in-tomcat/)。您应该使用绝对路径。1)最好使用ApacheDerby,HSQLDB总是完全加载到RAM中