网络上关于存储可能会根据环境/其他条件而改变的变量的许多建议是将它们放在 web.xml 中,但 web.xml 不是在 war 文件中吗?即使你找到了爆炸的战争并改变它,如果你更新战争文件,它不会被覆盖吗?或者 webcontainer 是否提供任何方法来配置 web.xml 而无需修改 war 文件?
4 回答
根据我的经验,web.xml 变量的用途非常有限 - 唯一的优点是它是查找硬编码“配置”的标准位置。
有几种常见的解决方案可以更明智地配置 Web 应用程序,但都不是标准的:
- 使用系统属性(这通常涉及摆弄启动脚本,并且很难很好地了解整个配置)
- 使用环境变量(与系统属性相同的缺点)
- 从预定义的位置读取配置文件;通常从类路径中使用
getResourceAsStream
(IIRC 通常意味着将配置文件放在 Tomcat 的lib
目录中)
您还可以使用 JNDI,它的缺点是在设置和读取方面都相当重(如果您使用的是 vanilla Java,无论如何 - 例如 Spring 对从 JNDI 读取具有相当好的支持)。然而,JNDI相当好,因为它是针对每个应用程序的,而不是一个进程全局设置。如果您需要在同一台服务器上运行同一个应用程序的多个实例,JNDI 几乎是唯一的选择(尽管您可以使用它在某处指出一个配置文件,这使得事情更容易使用)。
这可能与您的兴趣相关:如何在 EAR 或 WAR 之外存储 Java EE 配置参数?
在 web.xml 中指定参数值的优点
- 使用您自己的设置文件需要额外的编码和管理。
- 将参数值直接硬编码到您的应用程序代码中会使它们在将来更难更改,并且更难为不同的部署使用不同的设置(例如:JDBC 设置、邮件服务器地址)。
- 使用您的代码的其他开发人员将能够更轻松地找到任何相关参数,因为这是设置此类参数的标准位置。
另见:
据我所知web.xml
,不提供存储自定义变量的能力。配置 Web 应用程序的典型方法是将配置存储在数据库中,单独的 properties/xml/json/other 文件,从单独的 Web 服务获取配置或通过环境变量提供配置。
通常使用所有这些的混合物。例如,您可以-D
在运行容器时使用 switch 添加系统变量。此变量将包含可以找到您的配置的文件或 URL 的路径。
您可以使用 OS 环境提供参数。
您的选择应该取决于您有多少参数,您正在开发什么样的应用程序以及如何配置应用程序服务器或计算机操作系统。例如,如果您在服务器上托管应用程序,则无法配置这些方式不适合您,因此 DB 或 Web 服务是您唯一的方式。
在 Tomcat 容器上工作的人认识到您发现的讽刺意味,并且已经实施了一种解决问题的方法。
他们为您提到的问题实施的解决方案是创建另一个 xml 文件... context.xml 文件,由服务器读取。
看来您可以编辑此文件并让 Tomcat 读取新值而无需重新启动......只要您将元素保留在 server.xml 之外。
我不使用 Tomcat,所以我可能会误解文档
GlassFish Web 容器支持类似的功能,但通过几个管理 cli 命令 (asadmin) 来实现:
可能有 Web 管理控制台支持,您可以通过编辑 domain.xml 来设置它们。看起来它不像 Tomcat 实现那样灵活……但它确实使它非常易于使用。