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

Java WebApp配置策略

  •  4
  • morgancodes  · 技术社区  · 14 年前

    我的webapp包括上传图片文件。在生产服务器上,需要将文件写入生产服务器/images上的/somepath_。对于本地开发,我想将文件写入/some_different_path/images。

    处理这些配置差异的最佳方法是什么?

    一个重要的要求是:我根本不想和生产服务器搞混,我只想能够部署一个war文件并让它工作。所以我不想使用任何需要我处理生产机器上的环境变量/类路径等的技术。不过,我可以在本地机器上设置这些。

    我想象两种可能的一般方法:

    1. 如果满足某些条件,则在运行时加载特殊的“dev”配置文件(环境变量/classpath/etc)
    2. 在构建过程中翻转开关(可能是Maven配置文件?)
    3 回复  |  直到 14 年前
        1
  •  2
  •   Pascal Thivent    14 年前

    简单的事情,比如 String 可以声明为 环境条目 web.xml 通过JNDI获得。下面是一个例子 env-entry 名为“ImagePath”。

    <env-entry> 
        <env-entry-name>imagePath</env-entry-name> 
        <env-entry-value>/somepath_on_production_server/images</env-entry-value> 
        <env-entry-type>java.lang.String</env-entry-type> 
    </env-entry>
    

    要从Java代码访问属性,请执行JNDI查找:

    // Get a handle to the JNDI environment naming context
    Context env = (Context)new InitialContext().lookup("java:comp/env");
    
    // Get a single value
    String imagePath = (String)env.lookup("imagePath");
    

    这通常是老式的 ServiceLocator 在这里缓存给定键的值。

    另一种选择是使用属性文件。


    处理多个环境的主要方法通常包括配置文件和过滤(属性文件甚至 web.xml )

    资源

        2
  •  1
  •   Thorbjørn Ravn Andersen    14 年前

    在与生产设置相对应的WAR文件中具有默认值,但允许在外部覆盖它们,例如通过系统属性或JNDI。

    String uploadLocation = System.getProperty("upload.location", "c:/dev");
    

    (未经测试)

        3
  •  1
  •   jon077    14 年前

    使用属性文件并不太困难,而且web.xml的可读性稍高。

    InputStream ldapConfig = getClass().getResourceAsStream(
              "/ldap-jndi.properties");
          Properties env = new Properties();
          try {
            env.load(ldapConfig);
          } finally {
            if (ldapConfig != null) {
              ldapConfig.close();
            }
          }