2009-11-05 34 views
2

我一直在使用eclipse插件構建GWT 1.7 + GAE應用程序。 系統常量被加載到MyConstants.properties文件中,該文件由單例MyConstants類加載,擴展了... gwt.i18n.client.Constants類。如何根據部署實例更改常量

我想爲MyConstants加載包含設置的多個文件一個像

  • MyConstants-local.properties
  • MyConstants-alpha.properties
  • MyConstants-beta.properties
  • MyConstants- prod.properties

我發現幾個引用Guice的枚舉階段,但這並沒有似乎得到杜松子酒的支持。此外,它只處理dev/prod,我絕對需要一個本地/ beta/prod解決方案。

有沒有辦法做到這一點使用命令行arg或其他實例定義的運行時參數,將加載到GAE時將工作?

+0

你需要常量客戶端還是服務器端? – Fedearne 2009-11-09 13:37:53

+0

這正是我最近苦苦掙扎的問題。 當我第一次寫這個問題時,我的印象是i18n.Constants在gwt(瀏覽器)和gae(服務器)上的工作方式都是一樣的。結果谷歌的i18n庫僅僅是瀏覽器端(不可移植到服務器)。 另外,Guin的Stage enum,與'付費書呆子'提出的解決方案一樣是可行的解決方案,在Gin中不被支持。 – Stevko 2009-11-13 05:08:54

回答

3

在GAE服務器端,我能夠用這些代碼區分我的開發環境與任何已部署的生產環境。

創建一個接口和兩個類文件。

public interface MyConstants { 
public String myConstant(); 
} 

public class MyConstantsDev implements MyConstants { 
public String myConstant() { return "xyzzy-dev"; }; 
} 

public class MyConstantsProd implements MyConstants { 
public String myConstant() { return "xyzzy-prod"; }; 
} 

使用「user.dir」env var定義了一點Guice魔術綁定。 user.dir路徑中的最後一個目錄是唯一的Google App Engine應用程序標識符或您的根項目開發目錄。一旦你知道這一點,你可以確定使用哪一組常量。

public class MyServerModule extends com.google.inject.AbstractModule { 

String appIdentifier = new File(System.getProperty("user.dir")).getName(); 
if (appIdentifier.equals("trunk")) { 
    // Load MyConstants-dev.properties 
    bind(MyConstants.class).to(MyConstantsDev.class).in(Singleton.class); 
} else { 
    // Load MyConstants-prod.properties 
    bind(MyConstants.class).to(MyConstantsProd.class).in(Singleton.class); 
} 
} 

這讓我注入開發/生產常量爲階級是這樣的:

public class MyDomainClass { 

@Inject 
public MyDomainClass(Logger logger, MyConstants const) { 
    logger.debug(const.myConstant()); 
}; 
} 
0

一件事,就是開發和部署環境之間的不同是SERVER_SOFTWARE環境變量:

if (System.getenv("SERVER_SOFTWARE").startsWith("Dev")) { 
    // Load MyConstants-dev.properties 
} else { 
    // Load MyConstants-prod.properties 
} 

也許你可以挑選吉斯模塊基於負載過這一點。

+0

我試着用已部署的java GAE應用程序進行此操作,但沒有「SERVER_SOFTWARE」env var,但您確實讓我走上了正確的道路。 – Stevko 2010-01-06 07:45:10

+0

啊。我很確定它存在於Python中。也許他們已經改變了它,或者Java環境不支持它。 – 2010-01-07 21:24:03

+0

您應該使用提供的界面,而不是未記錄的變量。 – mjaggard 2012-02-29 11:09:09

0

在用於獲取GAE SERVER_SOFTWARE上面的回答變量; SERVER_SOFTWARE環境變量是一個CGI默認值,因此它是一個Web服務器設置,不能通過系統環境變量訪問,但可以從ServletContext獲得。

這裏是一個應該讓你的價值你的需要(不知道爲什麼它的ServerInfo而不是ServerSoftware ...)代碼:

if (getServletContext().getServerInfo().startsWith("Dev")) { 
    // Load MyConstants-dev.properties 
} else { 
    // Load MyConstants-prod.properties 
} 
1

你應該用特別製作類型安全的接口來解決這一問題...

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) 
{ 
    //It's production. 
} 
else 
{ 
    //It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development) 
}