12

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

我们可以将事物设置为APP_HOME=/path/to/file( exportin.profile或类似的东西) 并将其访问为System.getenv("APP_HOME")

或者,或者使用属性 as-DAPP_HOME=/path/to/file并将其访问为System.getProperty("APP_HOME")

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

4

4 回答 4

19

Javadoc forSystem.getenv(String)直接解决了这个问题,

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

(强调我的)。

于 2012-12-25T00:14:18.293 回答
5

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

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

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

于 2012-12-25T00:12:09.550 回答
0

目前还不能发表评论,所以我将添加几点作为答案。

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

此外,有多个接口可以设置全局环境变量,因此随着时间的推移跟踪所有正在使用的值可能有点棘手。

于 2017-07-19T05:11:29.010 回答
0

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

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

于 2018-02-13T07:30:52.880 回答