2017-01-25 3 views
0

저는 Spring Boot를 사용하여 작은 애플리케이션을 개발했습니다.이 애플리케이션은 HSQLDB를 당분간 사용자를 저장하는 데이터베이스로 사용합니다. 내가하고 싶은 일은 Maven의 resource 폴더 내에 데이터베이스를 저장하는 것이다. 나는 자바 응용 프로그램을 시작할 때마다WAR 내의 리소스에있는 HSQLDB

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

그래서, (오른쪽 봄 부팅 앱으로 내 응용 프로그램의 주() 및 실행 클릭), 데이터베이스를 잘 저장됩니다 내 application.properties 파일은 다음과 같은 구성이 포함되어 있습니다.

그러나 WAR 파일을 mvn clean install spring-boot:repackage으로 패키징하고 Tomcat에 배포 한 다음 실행하면 데이터베이스가 분해 된 WAR에 저장되지 않습니다.

제 질문은 spring.datasource.url=jdbc:hsqldb:file:* 속성을 Maven 리소스 디렉토리에 저장하는 법을 알려주는 것입니다 (WAR를 분해 한 후에도 계속 나타납니다). pom.xml에서 사용되는 환경 변수를 사용할 수 있습니까?

편집 는 @ 스티브 C와 @fredt으로 답변을 감안할 때, 나는 데이터베이스가 전쟁에 저장되지 않아야 함을 깨달았다. 대신, 나는 사용자의 집 dir 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 디렉토리를 포함하도록 빌드 스크립트를 변경 한 다음 db에 적절한 경로가 있는지 확인하십시오 서버 컨테이너에있는 파일 –

+0

@Redlab 절대 경로를 사용하고 싶지 않습니다. WAR가 배치 될 시스템의 성격 (Linux, win ...)이나 실행 여부를 알지 못하기 때문에 자바와. – russellhoff

답변

2

WAR 파일의 디렉토리와 내용은 읽기 전용입니다.

WAR에 포함하기 전에 HSQLDB 데이터베이스 .properties 파일에서 read_only 플래그를 설정할 수 있습니다. URL이 jdbc:hsqldb:res:<path> 인이 종류의 데이터베이스에 액세스합니다.

영구적으로 업데이트 할 수있는 데이터베이스에 데이터를 저장하려면 응용 프로그램의 (처음에는 존재하지 않는) 데이터베이스에 연결하고 리소스의 데이터가없는 경우 해당 테이블을 설정하십시오. 그런 다음 데이터를 저장할 수 있습니다. 데이터베이스 경로는 jar 및 자원에 사용되는 디렉토리 외부에 있어야합니다.

댓글과는 달리, HSQLDB는 메모리에 데이터를 저장하는 것에 국한되지 않으며 캐시 된 테이블이라고하는 디스크 기반 테이블을 가질 수 있습니다.

데이터베이스 URL에 변수를 포함하여 웹 서버에서 미리 정의 된 속성을 선택할 수 있습니다. 예를 들어 :

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의 모든 내용이 jar의 루트에 복사됩니다.

war 파일을 만드는 경우, src/main/resources의 모든 내용이 전쟁의/WEB-INF/classes 디렉토리의 루트에 복사됩니다.

이제 JDBC URL jdbc:hsqldb:file:src/main/resources/database/dashboard은 상대 경로가있는 파일을 나타냅니다. 런타임에이 경로는 현재 작업 디렉토리와 관련이 있습니다. 어쨌든 런타임에는 존재하지 않을 것입니다.당신이 정말로 당신의 WAR 내 데이터베이스를 구축하려면

는 다음 주어진 : 당신이 분해 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 스프링을 사용하는 것이 좋습니다. 스프링 구성시 servletContext에 액세스하면됩니다.