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

时间:2012-12-24 23:48:51

标签: java environment-variables system-properties

我想知道下列哪一项是首选方法?

我们可以将APP_HOME=/path/to/fileexport中的.profile或其他内容设置为“System.getenv("APP_HOME")

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

进行访问

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

4 个答案:

答案 0 :(得分:18)

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

  

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

(强调我的)。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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