2012-08-28 112 views
0

我有一個應用程序的3個.properties文件。每個文件都用於開發,測試和生產環境。將這三個文件合併成一個文件是否可行(並且實用)?如何做呢?或者最好將每個文件保存在自己的環境中?這是代碼。是否可以將3個.properties文件合併到一個.properties文件中?

enter code here 
lock-timeout=7200000 
usesLogin=true 
uses-hardlocks=false 
use-nested-roles=1 

# Password Change URL for VSRD, VSRT and VSRP (in that order) 
#pwchange-url=https://iteodova-md.dev.fema.net/va-npsc/pwchange/default.asp 
#pwchange-url=https://iteodova-md.dev.fema.net/va-npsc/pwchange_tdl/default.asp 
pwchange-url=https://iteodova-md.fema.net/va-npsc/pwchange/default.asp 

# Database Connectivity and User Session Management 

jdbc-driverClassName=oracle.jdbc.driver.OracleDriver 
#jdbc-url=jdbc:oracle:thin:@wnli3d3.fema.net:1521:vsrd 
#jdbc-url=jdbc:oracle:thin:@wnli3d2.fema.net:1521:vsrt 
#jdbc-url=jdbc:oracle:thin:@mwli3d1.fema.net:1521:vsrp 
jdbc-url=jdbc:oracle:thin:@wnli3d4.fema.net:1521:vsrp 

回答

0

你可以使用Apache的Commons Configuration

例如:

CompositeConfiguration config = new CompositeConfiguration(); 
config.addConfiguration(new PropertiesConfiguration("color.properties"); 
config.addConfiguration(new PropertiesConfiguration("application.properties")); 

或者包括如下例所示:

# usergui.properties 

include = colors.properties 
include = sizes.properties 
+0

2015年的文件位置:https://commons.apache.org/proper/commons-configuration/ –

0

您可以使用屬性這樣有資格。

在下面的代碼,你可以有

key=value 

爲默認值,就像你現在做的和

key.ENVIRON=value 

,如果它需要針對不同環境。如您所見,代碼非常短,並且它允許輕鬆比較不同的配置,因爲它們都在同一個位置。

如果您有複雜的系統,您可以使用ENVIRON.TYPE.INSTANCE擴展此方法。

public class EnvironProperties extends Properties { 
    private final String environ; 

    public EnvironProperties(String environ) { 
     this.environ = environ; 
    } 

    @Override 
    public String getProperty(String key) { 
     String property = super.getProperty(key + "." + environ); 
     return property == null ? super.getProperty(key) : property; 
    } 

    public String getEnviron() { 
     return environ; 
    } 

    public static void main(String... args) throws IOException { 
     String properties = "lock-timeout=7200000\n" + 
       "usesLogin=true\n" + 
       "uses-hardlocks=false\n" + 
       "use-nested-roles=1\n" + 
       "\n" + 
       "# Password Change URL for VSRD, VSRT and VSRP (in that order)\n" + 
       "pwchange-url=https://iteodova-md.dev.fema.net/va-npsc/pwchange/default.asp\n" + 
       "pwchange-url.PROD=https://iteodova-md.fema.net/va-npsc/pwchange/default.asp\n" + 
       "\n" + 
       "# Database Connectivity and User Session Management\n" + 
       "\n" + 
       "jdbc-driverClassName=oracle.jdbc.driver.OracleDriver\n" + 
       "jdbc-url.TEST=jdbc:oracle:thin:@wnli3d3.fema.net:1521:vsrd\n" + 
       "jdbc-url.DEV=jdbc:oracle:thin:@wnli3d2.fema.net:1521:vsrt\n" + 
       "jdbc-url.PROD=jdbc:oracle:thin:@mwli3d1.fema.net:1521:vsrp\n" + 
       "jdbc-url=jdbc:oracle:thin:@wnli3d4.fema.net:1521:vsrp"; 

     EnvironProperties dev = new EnvironProperties("DEV"); 
     EnvironProperties test = new EnvironProperties("TEST"); 
     EnvironProperties prod = new EnvironProperties("PROD"); 

     for (EnvironProperties ep : new EnvironProperties[]{dev, test, prod}) { 
      System.out.println("[" + ep.getEnviron() + "]"); 
      ep.load(new StringReader(properties)); 
      for (String prop : "uses-hardlocks,pwchange-url,jdbc-url".split(",")) 
       System.out.println(prop + "= " + ep.getProperty(prop)); 
     } 
    } 
} 
+0

你好彼得, 我有一些更多的信息是什麼最終用戶想要。他們使用的是Subversion,並且不想檢入和檢出3個屬性文件。每個文件都會根據它們所處的環境進行更改(因此在Subversion中有3個屬性文件)。所以,作爲一個例子,他們希望能夠對屬性文件進行更改,並使其能夠在所有環境中工作,而無需從DEV,TEST到PROD進行更改。這是可能的#VSRD,VSRT和VSRP的#密碼更改URL,以及 #數據庫連接和用戶會話感謝您的幫助Mike – michael

+0

他們可以更改默認值就像一個普通的屬性文件。如果他們希望這些值有所不同,他們需要某種方式來給出多個值,並將這個值與環境進行匹配。 –

0

將屬性保存在單獨的文件中(即用於測試,分段,生產等)是一個好主意。它們之間的切換可以通過與-D選項運行Java來完成:

java -DpropertiesType=test ... 

超載的屬性和合並都在Spring framework有效地完成。

你可以看看this的例子。

祝你好運!

0

我同意這樣的觀點,即最好將屬性保存在單獨的文件中。如果您使用環境變量或配置文件(如果您使用的是Spring),則可以在'src/main/resources'中將文件物理分隔到各自的目錄中。然後,您只需根據環境變量或配置文件設置閱讀正確的一個。你如何做到這一點取決於你的Java堆棧的細節。例如,使用Spring和Java配置你會做:

@Configuration 
public class MyMainConfig { 

    public MyMainConfig() { 
     super(); 
    } 

    @Configuration 
    @Profile("dev") 
    @PropertySource({ "classpath:/dev/myPropertyFileName.properties" }) 
    static class Dev 
    { } 

    @Configuration 
    @Profile("test") 
    @PropertySource({ "classpath:/test/myPropertyFileName.properties" }) 
    static class Test 
    { } 

    @Configuration 
    @Profile("prod") 
    @PropertySource({ "classpath:/prod/myPropertyFileName.properties" }) 
    static class Prod 
    { } 
}