【问题标题】:When to use environment variables vs. system properties?何时使用环境变量与系统属性?
【发布时间】:2012-12-11 04:24:14
【问题描述】:

我想知道以下哪种方法是首选方法?

我们可以将其设置为APP_HOME=/path/to/fileexport.profile 或类似的东西)并以System.getenv("APP_HOME") 访问它

或者,或者将属性用作-DAPP_HOME=/path/to/file 并以System.getProperty("APP_HOME") 访问它

现在 .. 任何一种方法都可以为应用程序的立场提供价值,但两种方法都是首选吗?为什么?什么时候?

【问题讨论】:

  • 为什么一个比另一个更受欢迎? IMO env vars 应该被通过 -D 指定的选项覆盖,但除此之外,嗯。
  • 好吧,我们有两个选项可以做同样的事情,对吧?因此问题
  • 为什么不同时使用呢?搜索密钥的系统属性,如果不存在,则搜索环境。它们并不是一回事,因为一个需要为应用程序显式设置值,而另一个不需要。
  • 另外,请注意 getEnv 曾经被弃用。如果您使用的是 Java 1.3 或 1.4,则应该只使用系统属性。
  • 好酷。内森,请answer 我可以接受。

标签: java environment-variables system-properties


【解决方案1】:

System.getenv(String) 的 Javadoc 直接解决了这个问题,saying

系统 属性环境变量都是 名称和值之间的概念映射。两个都 机制可用于将用户定义的信息传递给 Java 进程。环境变量具有更全局的影响, 因为它们对进程的所有后代可见 它定义了它们,而不仅仅是直接的 Java 子进程。 它们可以有细微的不同语义,例如大小写 不敏感,在不同的操作系统上。对于这些 原因,环境变量更可能有 意外的副作用。 最好使用系统属性 在可能的情况下。 应在以下情况下使用环境变量 需要全局效果,或者当外部系统接口 需要一个环境变量(例如PATH)。

(强调我的)。

【讨论】:

    【解决方案2】:

    如果您使用的是 Java 1.3 或 1.4(以及 1.2,IIRC),您应该使用系统属性,因为 System.getenv 已被弃用。它在 Java 1.5 中恢复。相关的bug报告可以在here找到。

    你可以同时使用。搜索密钥的系统属性,如果它不存在,则搜索环境。这让您两全其美。

    这些确实不是一回事:一个需要明确设置值,而另一个不需要。另外,请注意,环境是放置一些字符串以实现互操作性的方便位置。

    【讨论】:

    • 需要注意的是System.getenv,而不是getEnv
    • 不应使用 System.getenv() 方法访问环境变量,因为并非所有平台都支持环境变量。 -- CodePro代码分析工具给出的推理
    • @AnujBalan 默认系统环境不应依赖于平台无关的行为。但是,可以通过 ProcessBuilder 为子流程创建人工(独立于平台)环境,因此严格禁止其使用可能会导致 CodePro 等工具报告误报
    【解决方案3】:

    暂时还不能评论,所以我会补充几点作为答案。

    我同意 javadoc 的说法“最好在可能的情况下使用系统属性。”,用我自己的话来说,在看到这个页面之前,Java 系统变量被封装在 JVM 中。它们对主机上的其他进程不可见,因此与主机系统的耦合较少。

    此外,有多个接口可以设置全局环境变量,因此跟踪一段时间内使用的所有值可能有点棘手。

    【讨论】:

      【解决方案4】:

      应该考虑使用环境变量 (envs) 和系统属性之间的一个重要区别是环境变量不能在运行时/运行过程中更改,但系统属性可以。参考Javadoc:

      https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setProperties-java.util.Properties-

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 2015-08-20
        • 1970-01-01
        • 2020-04-03
        • 2015-03-16
        • 1970-01-01
        • 2011-02-21
        • 2015-09-16
        相关资源
        最近更新 更多