如何根据部署实例更改常量

时间:2009-11-05 19:03:56

标签: java google-app-engine gwt guice gin

我一直在使用eclipse插件构建一个GWT 1.7 + GAE应用程序。 系统常量被加载到MyConstants.properties文件中,该文件由扩展... gwt.i18n.client.Constants类的单例MyConstants类加载。

我希望MyConstants加载包含

等设置的多个文件中的一个
  • MyConstants-local.properties
  • MyConstants-alpha.properties
  • MyConstants-beta.properties
  • MyConstants-prod.properties

我发现了Guice的Enum Stage的几个引用,但这似乎不受杜松子酒的支持。此外,它只处理dev / prod,我肯定需要本地/ beta / prod解决方案。

有没有办法使用命令行arg或其他实例定义的运行时参数来加载到GAE时才能工作?

4 个答案:

答案 0 :(得分: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);
 }
}

这允许我将dev / prod常量注入到这样的类中:

public class MyDomainClass {

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

答案 1 :(得分:1)

您应该使用特制的类型安全界面来解决这个问题......

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

答案 2 :(得分:0)

开发和部署环境之间的一个不同之处是SERVER_SOFTWARE环境变量:

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

也许你可以选择加载哪个Guice模块。

答案 3 :(得分: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
}