2013-03-12 65 views
4

我正在使用java与春天。Java jvm选项覆盖属性文件内的属性

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

由于某种原因,如果我想覆盖一个属性,我看到一些我们可以通过传递属性和它的值通过传递它作为jvm选项来覆盖属性。

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

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

回答

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)。

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"); 
    } 
} 

最初测试从测试打印的值.properties - 1。但是,如果使用-Dxxx = 2运行测试,则会打印2。这是系统属性从文件

1

在1行中的问题: 字符串connUrl = System.getProperty(“com.abc.project.model.jdbc.ConnectionUrl”,prop.getProperty(“com.abc.project.model.jdbc.ConnectionUrl”));