使用相对于配置文件的路径引用 Spring 属性文件

Posted

技术标签:

【中文标题】使用相对于配置文件的路径引用 Spring 属性文件【英文标题】:Reference Spring properties file using path relative to config file 【发布时间】:2011-04-06 09:23:03 【问题描述】:

我正在将属性从我的 Spring 配置文件中移动到一个单独的属性文件中。这包含在配置文件中

<bean class="org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer">
  <property name="location" value="file:properties/$CONFIG_MODE/service.properties" />
</bean>

就目前而言,属性文件的位置是相对于服务器进程的当前工作目录

这就要求进程必须从特定的工作目录启动,甚至更糟的是允许(公认是远程的)它可以拾取完全不同的属性文件的可能性 - 例如,如果它是从工作目录启动的目录设置为旧版本的服务。

我想使用相对于包含配置文件的目录的路径来引用属性文件。

查看FileSystemResource,似乎createRelative可能是我需要的,但我无法弄清楚如何在配置文件中使用它。

谢谢,

史蒂夫

【问题讨论】:

【参考方案1】:

我不知道有什么办法。

但是,您可以做的是从类路径加载属性文件:

<bean class="org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer">
  <property name="location" value="classpath:path/to/service.properties" />
</bean>

你的属性文件的类路径位置是一个更可预测的情况,只要你的类路径设置正确,它就可以工作。

【讨论】:

不错的解决方案 - 谢谢。唯一的问题(我承认这根本不是一个严重的问题)是有时能够直接查看/编辑属性文件很有用 - 例如在紧急情况下,或进行一些快速测试。把它放在罐子里并不能防止这种情况发生,但会有点麻烦。 @stevec:它不必位于 JAR 文件中,它可以很容易地位于类路径上的文件系统目录中。 一旦我使用@Value("$thing.inside.service.properties"),这会起作用吗?【参考方案2】:

使用 3.1,您可以根据需要将文件远离类路径。

使用下面的bean定义,

<bean class=
    "org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer">
  <property name="location" 
    value="file:$props.path/service.properties" />
</bean>

您可以使用 java 命令行设置属性

java ... -Dprops.path=path/to/where/it/is

【讨论】:

【参考方案3】:

假设您已将 config.properties 文件放在 WEB-INF 中 那么:

<bean id="propertyConfigurerInternal"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
    <value>classpath:../config.properties</value>
</property>

【讨论】:

以上是关于使用相对于配置文件的路径引用 Spring 属性文件的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis mappers元素标签及其属性配置

如何在基于xml的spring配置中为hibernate.javax.cache.uri属性指定相对路径

绝对路径与相对路径

Spring xml配置文件相对路径问题

无法使用相对路径导入 Spring bean 定义文件

相对路径 web