【问题标题】:Java system properties and environment variablesJava 系统属性和环境变量
【发布时间】:2011-10-26 15:59:25
【问题描述】:

JVM中系统属性System.getProperties()和环境变量System.getenv()有什么区别?

【问题讨论】:

    标签: java variables properties system environment


    【解决方案1】:

    【讨论】:

    • 绝对正确,波西米亚人。环境变量是“OS 事物”,属性是“Java 事物”。碰巧的是,Java 选择将 OS 变量作为属性公开(就像 Java 将当前目录和“其他东西”作为属性公开一样),但它们实际上是不同的东西。
    • @Bohemian 如果我通过java -Dpropname=value 设置属性,我该如何检索这些属性?
    • System.grtProperties() 列出了所有属性,并且从命令行设置的属性将在那里,但是如果您要问的话,无法将它们与系统添加的其他属性区分开来。
    • 注意,你也可以通过环境变量JAVA_TOOL_OPTIONS来设置系统属性。
    • @KanagaveluSugumar 是的,您需要重新启动:启动时从环境中读取环境变量设置。即System.getenv(String name) 不会在调用时从系统中动态读取值。
    【解决方案2】:

    我认为两者之间的区别归结为访问。环境变量可由任何进程访问,而 Java 系统属性只能由它们添加到的进程访问。

    正如 Bohemian 所说,环境变量是在操作系统中设置的(但是它们“可以”通过 Java 设置),系统属性作为命令行选项传递或通过setProperty() 设置。

    【讨论】:

    • 最后是变量的添加方式和变量的作用域。
    • 请记住,其他进程可以找到用于启动进程的 cmd,因此也可以找到 java 系统属性。
    • 还有更多内容。本教程详细解释:youtu.be/vQYfOMrdgpg - 基本上 env vars 也可以有范围,例如设置在一个外壳中可能在另一个外壳中不可见。您通常不能在运行时设置它们,因为它们在主机上,但是您可以使用扩展等在 JUnit 5 中(在运行时)设置它们。
    • 这个答案似乎不正确。环境变量的范围是每个进程。每个进程都会看到自己的环境。
    • 环境变量映射是 Windows 和每个 UNIX 后代中的每个进程对象。最好考虑的是“进程属性”或者某种进程私有的东西。此映射是在创建流程时创建的。初始值由创建流程的人设置。通常,此地图应是创建者地图的副本。用户应用程序一般是由用户shell创建的,因此,用户应用程序的环境一般应由用户shell环境的副本构成。这里没有动态继承,没有“回退到父”机制。
    猜你喜欢
    • 2015-09-12
    • 2015-03-16
    • 2012-03-29
    • 2020-04-03
    • 2011-02-21
    • 1970-01-01
    • 2015-09-16
    • 2012-12-11
    相关资源
    最近更新 更多