Java jvm选项覆盖属性文件中的属性

时间:2013-03-12 14:05:39

标签: java properties jvm override

我正在使用java with spring。

我有独立的应用程序,其属性文件包含数据库连接URL。

由于某些原因,如果我想覆盖一个属性,我会看到一些我们可以通过传递属性及其值来覆盖属性,方法是将其作为jvm选项传递。

java -Dcom.abc.project.model.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://abc-al01.abc.com/model_QA [executeablejar] myjavafile

有人可以解释它是如何运作的吗?

4 个答案:

答案 0 :(得分:3)

因此,您希望从属性文件中加载一些与数据库相关的数据,但是您希望实现一个使用系统属性数据覆盖该数据的功能,为什么不能这样做呢?

Properties prop = new Properties();

try {
    prop.load(new FileInputStream("config.properties"));

    String connUrl = prop.getProperty("com.abc.project.model.jdbc.ConnectionUrl");
    String theOtherConnUrl = System.getProperty("com.abc.project.model.jdbc.ConnectionUrl");

    if(theOtherConnUrl!=null){
        connUrl = theOtherConnUrl;
           ...

我相信覆盖行为将取决于您实现从属性文件和系统属性中检索此数据的代码的方式,为什么不将所有与DB相关的数据保留在单个属性文件中(多个连接数据由不同的参数名称分隔,例如,jdbc.sqlserver.host& jdbc.oracle.host)并使用标志来标识您要使用的数据(您可以将此标志放在系统属性中,例如, - Dcom.abc.project.model.jdbc.db = SQLSERVER)。

答案 1 :(得分:1)

一行: String connUrl = System.getProperty(" com.abc.project.model.jdbc.ConnectionUrl",prop.getProperty(" com.abc.project.model.jdbc.ConnectionUrl")) ;

答案 2 :(得分:0)

这是一个基本的例子

context.xml

<context:property-placeholder location="/test.properties" system-properties-mode="OVERRIDE"/> 
<bean class="Test">
    <property name="xxx" value="${xxx}" />
</bean>

test.properties

xxx=1

Test.java

public class Test {

    public void setXxx(String xxx) {
        System.out.println(xxx);
    }

    public static void main(String[] args) throws Exception {
        new ClassPathXmlApplicationContext("context.xml");
    }
}

最初,Test会打印test.properties - 1中的值。但如果您使用-Dxxx = 2运行Test,则会打印2。这是系统属性覆盖文件

的属性

答案 3 :(得分:0)

看到这个..它解决了spring配置本身的问题..无需更改代码

Spring placeholder format