我有一个关于让spring从项目外部的应用程序上下文中读取文件的快速问题。我有两个项目;1)项目A 2)项目数据库。项目A的结构如下:
ProjectA
|-src
|-main
|-webapp
|-WEB-INF
|-config
|-spring
Project Database的结构如下:
Project Database
|-db
|-scripts
|-deltas
在Project A的spring目录中,我有一个dao-context文件。在这我已经配置了一个嵌入式数据库,但我想从项目数据库的脚本初始化数据库。
我知道嵌入式数据库配置应该像下面这样:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="someSchema.sql"/>
</jdbc:embedded-database>
然而,我正试图确定在项目数据库中引用脚本的最佳方式。换句话说,如果我想在位置中使用脚本,应该是location的值。一些细节:
- 两个项目将在同一层次结构中一起签出。
- 此外,该数据库将仅用于运行测试,而不是实际的生产代码。因此,无论解决方案是什么,当我运行测试任务时,它应该与我的构建脚本兼容。
- 最后,我想避免使用绝对文件路径,因为这将在多台机器上运行。
任何想法?
欢呼编辑:这两个项目只是文件夹而不是jar。两个项目都不在彼此的类路径中。除了它们在同一目录之外,没有任何关系。
编辑2:另一种情况(很可能发生)是db脚本可以在与ProjectA相同的项目中,但不在类路径中。例如,目录结构可能如下所示:
ProjectA
|-db
|-scripts
|-deltas
|-src
|-main
|-webapp
|-WEB-INF
|-config
|-spring
如果是这种情况,我如何从'spring'目录访问'delta '目录中的脚本?
我想我已经(或多或少)理解了你的问题,但是有很多注意事项。
首先,在开发应用程序时,有3类路径:- 包含java源代码的源路径(将被编译),以及其他配置或数据文件(将被复制)
- 从先前的目标路径生成的,这些路径是在jar或wars(或…)中组装的
- 数据路径可能包含数据文件,或者jar或war之外的文件数据库。
web应用程序通常独立于其源路径执行,最终在另一台机器上:您构建war并部署在servlet或JEE容器上。
你能做的是使用环境变量、系统属性或属性值来设置web应用程序中数据路径的根目录。当在应用程序上下文中使用PropertySourcesPlaceholderConfigurer
设置${...}
值时,Spring允许环境变量覆盖属性值。然后使用该值访问项目外的数据。
在您的示例中,您为db
位置定义了这样一个属性,并访问与该位置相关的所有数据库配置。