何时使用环境变量与系统属性?

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

我们可以设置为APP_HOME=/path/to/file (在.profile export或沿着这些行输出)并将其作为System.getenv("APP_HOME")

或者,使用-DAPP_HOME=/path/to/file属性, -DAPP_HOME=/path/to/file其作为System.getProperty("APP_HOME")

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

如果您使用的是Java 1.3或1.4(以及1.2,IIRC),那么您应该使用系统属性,因为不推荐使用System.getenv 。 它在Java 1.5中恢复。 相关的错误报告可以在这里找到。

你可以使用两者。 搜索密钥的系统属性,如果不存在,则搜索环境。 这为您提供了两全其美的体验。

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

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

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

(强调我的)。

暂时无法发表评论,所以我会补充几点作为答案。

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

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

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

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