java webapp配置策略

时间:2010-08-11 22:10:05

标签: java deployment maven-2 build development-environment

我的部分网络应用涉及上传图片文件。在生产服务器上,需要将文件写入/ somepath_on_production_server / images。对于本地开发,我想将文件写入/ some_different_path / images。

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

一个重要的要求是:我根本不想弄乱生产服务器,我只是希望能够部署war文件并让它工作。所以我不想使用任何需要我搞乱环境变量/ classpath / etc的技术。在生产机器上。我很高兴在我的本地机器上设置它们。

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

  1. 如果满足某些条件,则在运行时加载特殊的“dev”配置文件(环境变量/类路径/等)
  2. 在构建过程中翻转开关(可能是maven配置文件?)

3 个答案:

答案 0 :(得分:2)

String之类的简单事物可以在web.xml中声明为环境条目,并通过JNDI获取。下面是一个名为“imagePath”的env-entry示例。

<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中完成的,您可以在其中缓存给定密钥的值。

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


处理多个环境的maven方式通常涉及配置文件和过滤(属性文件甚至是web.xml)。

资源

答案 1 :(得分:1)

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

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

(未测试的)

答案 2 :(得分:1)

使用属性文件并不太困难,而且web.xml

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