我想知道以下哪个是首选方法?
我们可以将事物设置为APP_HOME=/path/to/file
( export
in.profile
或类似的东西) 并将其访问为System.getenv("APP_HOME")
或者,或者使用属性 as-DAPP_HOME=/path/to/file
并将其访问为System.getProperty("APP_HOME")
现在.. 任何一个都可以为应用程序的立场提供价值,但是这两种方法都是首选吗?为什么?什么时候?
我想知道以下哪个是首选方法?
我们可以将事物设置为APP_HOME=/path/to/file
( export
in.profile
或类似的东西) 并将其访问为System.getenv("APP_HOME")
或者,或者使用属性 as-DAPP_HOME=/path/to/file
并将其访问为System.getProperty("APP_HOME")
现在.. 任何一个都可以为应用程序的立场提供价值,但是这两种方法都是首选吗?为什么?什么时候?
Javadoc forSystem.getenv(String)
直接解决了这个问题,说:
系统属性和环境变量在概念上都是名称和值之间的映射。这两种机制都可用于将用户定义的信息传递给 Java 进程。环境变量具有更全局的影响,因为它们对定义它们的进程的所有后代可见,而不仅仅是直接的 Java 子进程。在不同的操作系统上,它们可能具有细微的不同语义,例如不区分大小写。由于这些原因,环境变量更有可能产生意想不到的副作用。 最好尽可能使用系统属性。 当需要全局效果或外部系统接口需要环境变量(例如
PATH
)时,应使用环境变量。
(强调我的)。
如果您使用的是 Java 1.3 或 1.4(和 1.2,IIRC),您应该使用系统属性,因为System.getenv
已弃用。它在 Java 1.5 中恢复。相关的错误报告可以在这里找到。
您可以同时使用两者。搜索密钥的系统属性,如果它不存在,则搜索环境。这为您提供了两全其美的体验。
这些真的不是一回事:一个需要明确设置值,另一个不需要。另外,请注意,环境是放置一些字符串以实现互操作性的便利位置。
目前还不能发表评论,所以我将添加几点作为答案。
我同意 javadoc 的说法“最好在可能的情况下使用系统属性。”,用我自己的话来说,在看到这个页面之前,Java 系统变量被封装在 JVM 中。它们对主机上的其他进程不可见,因此与主机系统的耦合较少。
此外,有多个接口可以设置全局环境变量,因此随着时间的推移跟踪所有正在使用的值可能有点棘手。
应该考虑使用环境变量(envs)和系统属性之间的一个重要区别是环境变量不能在运行时/在运行过程中更改,但系统属性可以。参考Javadoc:
https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setProperties-java.util.Properties-