如何修改java属性文件中的值

时间:2015-11-24 15:18:32

标签: java spring environment-variables properties-file

我有一个config.properties文件,其中包含可配置的属性,例如在tomcat上部署的webapp中的数据库连接详细信息。 e.g。

local.driver: com.mysql.jdbc.Driver
local.username:myuser
local.password:mypass

dev.driver: com.mysql.jdbc.Driver
dev.username:mydevuser
dev.password:mydevpass

我可以使用spring Environment对象或@Value从config.properties中检索值。 我的问题是,当你在dev上运行本地和dev属性时,如何使Spring的环境对象选择本地属性?另外,保存敏感数据听起来也不正确,例如生产数据库连接 属性文件中的详细信息将在代码库中浮动。那么在生产环境中如何添加生产细节呢?理想情况下,我希望在我喜欢的时候更改它们,而不必重新部署应用程序。我正朝着正确的方向前进吗?

注意 - 我在SO上看到的所有答案都讨论了在java代码中更改这些属性。我不想这样做,我希望能够独立于应用程序代码配置这些值。

由于

2 个答案:

答案 0 :(得分:0)

您可以查看spring profiles以加载特定环境的特定文件。

或者,您也可以使用JNDI属性或容器中设置的环境属性来参数化应用程序上下文中加载属性的文件。

示例:

<context:property-placeholder ignore-unresolvable="true" location="${env.config.file:classpath*:META-INF/spring/profiles/dev/dev.properties}" />

可以在启动时使用-Denv.config.file =在容器级别(例如Tomcat)设置env.config.file。通过这样做,Spring自动在系统中找到属性并替换它。如果未明确设置它(例如,在dev中可能使用其他容器,例如jetty),它将使用给定的默认值(在此示例中为dev.properties)。

通过将属性文件放在war / ear之外,可以随意更改它们,只需要重新启动上下文。或者,您可以查看可重新加载的属性占位符。如果您不希望明确存储在战争中的密码,这也会有所帮助。

要加密属性文件中的信息,如果您使用的是Spring 3,还可以检查:http://www.jasypt.org/spring3.html

答案 1 :(得分:0)

用于选择特定值的env,您有几个选项

  • 如果您可以基于env创建多个属性文件,那么您可以使用Spring配置文件功能(即spring.profiles.active),这将允许控制通过JVM参数加载的属性文件。
  • 如果您仍想将所有内容保留在单个文件中,则可以覆盖PropertyPlaceholderConfigurer以从JVM参数获取env详细信息或默认为某个值

在安全问题上,一种方法是将加密密码存储在prop文件中。