2017-01-25 30 views
0

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

#... 
spring.datasource.url=jdbc:hsqldb:file:src/main/resources/database/dashboard 
#... 

所以,当我开始使用Java应用程序(右键点击我的应用程序的main()和运行方式春季启动应用程序),数据库存储的权利。

但是,在将WAR文件打包为mvn clean install spring-boot:repackage后,将其部署到Tomcat(例如并运行它)后,数据库不存储在爆炸WAR中。

我的问题是我怎么能告诉spring.datasource.url=jdbc:hsqldb:file:*属性来存储Maven资源目录中的数据库(它将在爆炸WAR后仍然指向)?我可以使用pom.xml中使用的某种环境变量吗?

编辑 鉴于@Steve C和@fredt的答案,我意识到数据库不应该存储在战争中。相反,我会将其存储在用户的主目录spring.datasource.url=jdbc:hsqldb:file:~/tomcat_webapp_data/dashboard/database ..非常感谢!

+1

您似乎正在使用相对路径指向hsqldb。 Hsql的文件位置将相对于工作目录(可能是bin/in tomcat /)。你应该使用绝对路径。 – Redlab

+1

1)更好的使用Apache Derby,HSQLDB总是被完全加载到RAM内存中 - 这可能会让你的应用程序更大的DB 2)只是改变构建脚本包括整个db目录iinto war,然后一定要有正确的路径db在服务器容器中的文件 –

+0

@Redlab我不想使用绝对路径,因为我不知道将要放置WAR的系统的性质(linux,win ...)以及它是否会运行与java。 – russellhoff

回答

2

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

可以包括战前设置HSQLDB数据库属性文件的READ_ONLY标志。您使用jdbc:hsqldb:res:<path>网址访问这类数据库。

如果要将数据存储在持久性和可更新数据库中,请连接到应用程序中的(第一个不存在的)数据库,并设置其表格,如果它们尚不存在来自资源的数据。然后你可以存储数据。数据库路径应位于用于JAR和资源的目录之外。

相反的意见中的一个,HSQLDB不限于在存储器中存储数据,并且可以具有基于磁盘的表,称为CACHED表。

您可以在数据库中包括URL的变量拿起从Web服务器预先定义的属性。例如:

jdbc:hsqldb:file:${mydbpath} 

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_variables_url

1

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

如果你正在构建一个jar文件,然后在src/main/resources一切都被复制到罐子的根源。

如果你正在构建一个war文件,然后在src/main/resources一切都被复制到/ WEB-INF/classes中战争的根目录下。现在

,你的JDBC URL jdbc:hsqldb:file:src/main/resources/database/dashboard被指示使用相对路径的文件。在运行时,这个路径是相对于当前工作目录的 - 并且它在运行时不太可能存在。

如果你真的想建立你的战争中的数据库,然后给出:

  • 要部署的分解WAR文件(这是不可能写出WAR文件本身的内容);

  • 你真的很想将数据库存储在爆炸WAR中;

  • 你想把它放在WEB-INF/database/dashboard(如果你存储在WEB-INF目录之外,有安全隐患);

那么你可以使用类似计算JDBC网址:

... 
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即可。

相关问题