【问题标题】:External web-application configuration in TomcatTomcat 中的外部 Web 应用程序配置
【发布时间】:2018-02-06 09:17:38
【问题描述】:

有一个 Web 应用程序和它工作的许多环境。在每个环境中,它都有不同的设置,例如 DB 连接和 SOAP 端点,它们又在属性文件中定义并通过以下方式访问:

config.load(AppProp.class.getClassLoader().getResourceAsStream(
    PROPERTIES_FILE_PATH + PROPERTIES_FILE_NAME));

因此,每个环境的 WAR 文件都不同。

我们需要构建一个统一的 WAR 文件,它不包含任何配置,并且可以在任何环境(目前是 Tomcat 实例)中从其 WAR 文件之外获取其配置。

在我看来,答案Java Web Application Configuration Patterns 提供了全套常用方法,但只提供了几个示例。最吸引人的方式是配置 JNDI 查找机制。正如我猜想的那样,它允许通过上下文路径单独配置 Web 应用程序。但是在 Internet 和 Tomcat 的文档中都找不到简单的(逐步)说明。不幸的是,不能花太多时间研究这些复杂的东西,以满足如此看似简单自然的需求:(

感谢您在相关描述中的链接或有关该问题的任何替代建议。

【问题讨论】:

  • “很遗憾不能花太多时间研究这些复杂的东西……” - 这是“我没有做足够的研究”的另一种说法吗?
  • @Stephen C - 完全正确!

标签: java tomcat jndi


【解决方案1】:

如果只是将 WAR 部署在不同的环境(由不同的操作系统用户执行),那么您可以将所有配置文件放在用户的主文件夹中并将它们加载为:

config.load(new FileInputStream(System.getProperty("user.home") + PROPERTIES_FILE_NAME));

这为您提供了隔离和安全性,并使您的 WAR 完全可移植。但理想情况下,如果对您的情况有意义,您仍然应该提供内置的默认配置。

【讨论】:

  • 不要认为它足够灵活 :( 在stackoverflow.com/questions/1568985/… 中有一个带有硬编码绝对路径的版本。但是如果我们有两个实例,如果 Tomcat 在同一个盒子上。需要一些配置网络的东西-web 容器内的应用程序。
  • 只用不同的用户启动Tomcat。只是好奇你的情况是什么情况下你在同一个盒子上的两个不同的 Tomcat 实例中运行同一个应用程序(可能具有不同的上下文路径???)。
【解决方案2】:

我们采取的方法是基于我们现有的部署方法,即将WAR文件放在Tomcat旁边的文件系统中,并将指向WAR文件的context.xml部署到Tomcat。

上下文描述符允许提供在 servlet 中易于访问的初始化参数。我们还为使用 CDI(用于 Glassfish 和 TomEE 依赖注入)完成了这项工作。

如果您只有一个 WAR 文件部署到此 Tomcat 实例,您还可以将初始化参数添加到默认的全局上下文 XML。这些将是全局的,然后您可以直接部署 WAR 文件。这在开发过程中非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2021-12-15
    相关资源
    最近更新 更多