java – 我可以在多个环境中使用单个war文件吗?我是不是该?

我在我的工作中有一个Java Web应用程序,我想简化我们如何部署到我们的DEV,QA和PROD环境。

应用程序在启动时读取一系列属性,并且属性文件对于dev,qa和prod是不同的。每当我想部署到某个特定的环境,我将环境特定的属性文件放到我的应用程序文件夹,构建战争,然后将其部署到三个tomcat 5.5服务器之一。

我想要做的是有一个单一的.war具有所有环境的属性,并让应用程序在init过程中询问web服务器,以确定应用程序在哪个环境,因此要加载哪些属性。有没有一种简单的方法(或者,失败,一个标准的方式)做到这一点?

最佳答案
这真的取决于你使用这些属性。

一些(例如数据源)可以在容器本身中配置(Tomcat 5.5. JNDI Resources,也参见JDBC源部分)。

其他(特定于应用程序)可能的确需要属性。在这种情况下,您的选择是:

>在WAR文件中捆绑属性,并根据一些外部开关(环境变量或JVM属性)加载适当的子集,
>在您的每个服务器上设置部署过程,其中war已解包,并且属性文件(位于该服务器上的特定于该服务器的预定义位置)被复制到WEB-INF / classes(或其他适当的位置)。

至于“这是一个理想的目标” – 是的,我想是这样。具有单个WAR以在QA /分级中测试,然后部署到生产中,从而切断中间步骤,从而减少错误的机会。

更新(基于评论):

上述第1项指的是实际环境变量(例如,您在Windows中通过SET ENV_NAME = QA设置的东西,或ENV_NAME = QA中设置的东西;在Linux中导出ENV_NAME)。您可以使用System.getenv()从代码中读取其值,并加载相应的属性文件:

String targetEnvironment = System.getenv("TARGET_ENV");
String resourceFileName = "/WEB-INF/configuration-" + targetEnvironment + ".properties";
InputStream is = getServletContext().getResourceAsStream(resourceFileName);
Properties configuration = new Properties();
configuration.load(is);

但是,您可以改为通过JNDI(see Environment Entries in Tomcat doc)定义标量值:

<Context ...>
  <Environment name="TARGET_ENV" value="DEV" type="java.lang.String" override="false"/>
</Context>

并通过您的应用程序中读取

Context context = (Context) InitialContext().lookup("java:comp/env");
String targetEnvironment = (String) context.lookup("TARGET_ENV");
// the rest is the same as above

事情是,如果你将使用JNDI无论如何,你可能会放弃你的属性文件和通过JNDI配置一切。您的数据源将作为实际资源提供给您,并且基本属性将保持标量(虽然它们将是类型安全的)。

最终由你决定哪种方式更适合你的具体需求;都有利弊。

转载注明原文:java – 我可以在多个环境中使用单个war文件吗?我是不是该? - 代码日志