2013-03-12 80 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」));