我想知道下列哪一项是首选方法?
我们可以将APP_HOME=/path/to/file
(export
中的.profile
或其他内容设置为“System.getenv("APP_HOME")
或者,也可以使用-DAPP_HOME=/path/to/file
属性并将其作为System.getProperty("APP_HOME")
现在..任何一个都可以为应用程序的立场提供值,但是这两种方法都是首选吗?为什么?当α
答案 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-