【问题标题】:Comparison of Java System Properties and Context ParametersJava 系统属性和上下文参数的比较
【发布时间】:2018-09-25 23:25:41
【问题描述】:

在像 tomcat 这样的 servlet 容器中运行应用程序时,我有多种方法可以将自定义配置传递给应用程序:

  • 系统属性(在启动时作为 -D 参数传递)
  • 上下文参数(web.xml 或 context.xml)
  • 环境变量(操作系统范围)

虽然我对环境变量的优缺点充满信心,但我看不出系统属性和上下文参数的区别、优缺点。两者都可以在应用程序中轻松检索和设置。那么上下文参数存在的权利是什么?为什么不简单地将系统属性用于所有内容?

【问题讨论】:

  • 因为它们中的一些可能在所有机器中都相似,并且您不想强迫用户通过它们。您只需在 xml 中设置它们并根据上下文(而不是您正在运行的系统/机器)更改它们。环境很好,但它们是为所有 Java 应用程序共享的。系统属性介于两者之间。例如,如果您有 3 个 Java 应用程序并且您想使用不同的内存设置运行它们 - 您使用系统属性。
  • @VeselinDavidov 您说的是 webapp (META-INF/context.xml) 中的 context.xml,对吗?所以这就像 webapp 定义的默认值,可能会被自定义系统属性覆盖。所以是不是还是很相似?对不起,但我仍然看不到上下文参数的用例/优势,这是系统属性无法实现的:(
  • 这里的想法是开发人员不必控制容器的 Java 系统属性。特别是在过去,一方面有单独的团队开发应用程序,另一方面提供/运行 JEE 容器基础设施。在一个容器中运行多个应用程序也很常见。在这种情况下,提供/运行团队还没有准备好更改整个容器的系统属性。也可能有一个软件提供商提供了一个战争文件,他们不能/不会为客户的容器规定系统环境。

标签: java tomcat servlets


【解决方案1】:

那么上下文参数的存在权是什么?为什么不简单地将系统属性用于所有内容?

这样不同的应用可以有不同的值。

您可能希望为应用程序设置配置文件位置。说,

-Dconfig.file=/etc/myapp/config.cfg

如果您想同时运行同一应用程序的多个副本,您可能需要使用/etc/myapp/config1.cfg 和/etc/myapp/config2.cfg 等。

如果您使用的是系统属性,则该属性只能有一个值。使用上下文参数,您可以为每个应用程序设置一个不同的值。实际上,每个上下文:它可能是在不同配置下多次部署的同一个应用程序。

还有另一个原因,但这个更微妙。更改系统属性是……有问题的。一般来说,Java 组件在投入使用时会读取其配置,因此事后更改这些系统属性的值通常不会产生任何影响。例如,在设置 java.awt.headless 后尝试禁用它。

如果您想更改 config.file 的值,则必须重新启动 Web 应用程序,但您还必须在运行的 JVM 中更改该值。这是一个尴尬的操作。 (我想您的应用程序可能能够做到这一点,但是当有更好的方法来实现您的目标时,为什么还要麻烦呢?)。

对我来说更有意义的替代方法是更改​​上下文参数的值并重新部署 Web 应用程序。同样,这不会干扰在同一容器中运行的任何其他应用程序,并且还可以实现更改该应用程序配置的目标。

【讨论】:

  • 这可能是在系统属性与上下文参数之间做出决定的最佳解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多