我想知道以下哪一项是首选方法?何时使用环境变量与系统属性?
我们可以做一些事情,为APP_HOME=/path/to/file
(export
在.profile
或类似的规定)和访问它作为System.getenv("APP_HOME")
,或者使用性质为-DAPP_HOME=/path/to/file
和访问它作为System.getProperty("APP_HOME")
现在..无论是人们会为应用程序的立场提供可用的价值,但是哪种方法是首选的?为什么?什么时候?
我想知道以下哪一项是首选方法?何时使用环境变量与系统属性?
我们可以做一些事情,为APP_HOME=/path/to/file
(export
在.profile
或类似的规定)和访问它作为System.getenv("APP_HOME")
,或者使用性质为-DAPP_HOME=/path/to/file
和访问它作为System.getProperty("APP_HOME")
现在..无论是人们会为应用程序的立场提供可用的价值,但是哪种方法是首选的?为什么?什么时候?
如果您使用的是Java 1.3或1.4(和1.2,IIRC),则应该使用系统属性,因为System.getenv
已被弃用。它在Java 1.5中恢复。相关的错误报告可以在here找到。
您可以同时使用两者。搜索密钥的系统属性,如果不存在,则搜索环境。这给你两全其美。
这些确实不是一回事:一个需要显式设置值,另一个不需要。另外请注意,环境是放置一些字符串以实现互操作性的便利场所。
注意它是'System.getenv',而不是'getEnv'。 –
@DaveNewton:感谢您的纠正。将解决。 –
不应使用System.getenv()方法来访问环境变量,因为并非所有平台都支持环境变量。 - 由CodePro代码分析工具给出的推理 –
的Javadoc System.getenv(String)
地址这个问题直接,saying:
系统 性能和环境变量是名称和值之间都 概念映射。这两种机制都可用于将用户定义的信息传递给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-
为什么一个优于其他? IMO环境变量应该被-D指定的选项覆盖,但除此之外,meh。 –
那么,我们有2个选项可以做同样的事情吗?因此,问题 – JAM
为什么不能同时使用?搜索密钥的系统属性,如果不存在,则搜索环境。它们并不是一回事,因为它需要为应用程序显式设置值,而另一个则不需要。 –