代码之家  ›  专栏  ›  技术社区  ›  Stevko

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

  •  2
  • Stevko  · 技术社区  · 15 年前

    我一直在使用Eclipse插件构建GWT1.7+GAE应用程序。 系统常量加载到myinstants.properties文件中,该文件由扩展…gwt.i18n.client.constants类的singleton myinstants类加载。

    我希望MyInstants加载包含如下设置的多个文件之一

    • myinstants-local.properties
    • myinstants-alpha.属性
    • myinstants-beta.属性
    • myinstants-prod.properties公司

    我发现了几个对Guice的枚举阶段的引用,但这似乎不受gin支持。此外,它只处理dev/prod,我肯定需要一个本地/beta/prod解决方案。

    有没有一种方法可以使用命令行arg或其他一些实例定义的运行时参数来实现这一点,这些参数在加载到GAE时可以工作?

    4 回复  |  直到 13 年前
        1
  •  3
  •   Stevko    15 年前

    在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 magic绑定。user.dir路径中的最后一个目录是唯一的Google应用程序引擎应用程序标识符或根项目开发目录。一旦知道了这一点,就可以确定要使用的常量集。

    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() ); 
     };
    }
    
        2
  •  1
  •   mjaggard    13 年前

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

    if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
    {
      //It's production.
    }
    else
    {
      //It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
    }
    
        3
  •  0
  •   a paid nerd    15 年前

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

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

    也许您可以根据这个选择要加载的guice模块。

        4
  •  0
  •   lees2bytes    14 年前

    关于获得GAE的上述答案 服务器软件 variable;server_software environment变量是CGI默认值,因此它是Web服务器设置,不能通过系统环境变量访问,但可以从servletcontext获得。

    下面的代码应该能为您提供所需的价值(不知道为什么它的serverinfo而不是serversoftware…):

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