2013-06-05 57 views
4

有沒有辦法在tomcat中爲不同的war文件設置不同的環境變量?我正在使用第三方戰爭,並且需要對同一場戰爭進行多次部署,但具有不同的環境變量(因此會加載不同的配置)。tomcat中每次戰爭的不同環境變量

+0

它**有**是環境變量還是隻是你表達問題的方式? –

+0

第三方代碼沒有System.getenv,所以它必須在那裏 – ekaqu

回答

1

如果您獨立運行兩個Tomcat實例,這很容易。我假設你在談論OS環境變量。

您還可以在每個war/web應用程序的Tomcat中設置屬性。這會讓你在一個Tomcat實例中運行兩場戰爭。但這不是你問的。

+0

是的,我需要將該值設置爲一個操作系統環境變量(真的只需要進入System.getenv)。我可以嘗試設置兩個不同的tomcat(atm只需要兩條不同的路徑),那麼我會在bin/setenv.sh中執行此操作還是有更好的地方? – ekaqu

+0

Tomcat的tcServer版本非常簡單。你將不得不穀歌周圍找出如何與香草雄貓。我可能只是在運行Tomcat的同一實例的inetd中設置兩個shell腳本,但事先設置的環境不同。 –

+0

@ekaqu字面上只是複製和粘貼整個TC目錄 –

1

好,總瘋狂砍的想法:

實現一個PropertyPlayHolderConfigurer(或使用web.xml文件從Tomcat),爲每個應用程序實例和負荷特性,你有System.properties()同名。

然後,創建一個包含兩組屬性的委託屬性類。然後

Properties props = new DelegatingProperties(app1Props,app2Props) 
System.setProperties(delegate); 

public class DelegatingProperties extends Properties { 

    private Properties app1Props; 
    private Properties app2Props; 

    public DelegatingProperties(Properties app1Props, Properties app2Props) { 
     this.app1Props = app1Props; 
     this.app2Props = app2Props; 
    } 

    public String getProperty(String prop) { 
     // begin crazy science 
     String caller = new Throwable().getStackTrace()[0].getClassName(); 
     // this is where you get creative. 
     // Do the System.setProperties() above so you can intercept calls to 
     //getProperty() 
     // and find out the FQCN of the library class(es) that need these variable 
     // (use your debugger). 
     // then implement the logic here to decide which of the 2 property sets you have 
     // you will query to get the correct results  
    } 
} 

這些系統我們所談論的性質和他們是爲了廣泛的應用系統。你的圖書館可能是在1-app-1-jvm的時候開發的(或者開發者也可能是tard)。

我至少能獲得創意的道具嗎? :)