2

我一直在使用 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 的引用,但这似乎不受 gin 的支持。此外,它只处理 dev/prod,我绝对需要一个本地/beta/prod 解决方案。

有没有办法使用命令行 arg 或其他一些实例定义的运行时参数来执行此操作,这些参数在加载到 GAE 时会起作用?

4

4 回答 4

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”环境变量定义一点 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() ); 
 };
}
于 2010-01-06T08:32:05.127 回答
1

您应该使用特别制作的类型安全接口来解决这个问题......

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
{
  //It's production.
}
else
{
  //It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
}
于 2011-11-17T14:45:45.400 回答
0

开发环境和部署环境之间的不同之处在于SERVER_SOFTWARE环境变量:

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

也许您可以根据此选择要加载的 Guice 模块。

于 2009-11-06T18:10:42.873 回答
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
}
于 2010-06-28T18:00:20.740 回答