【问题标题】:Environment variables inheritance behaviour环境变量继承行为
【发布时间】:2018-01-04 12:19:54
【问题描述】:

提供如下代码sn-p:

public static void main(String[] args) throws InterruptedException {
    Map<String, String> env = System.getenv();
    for (String envName : env.keySet()) {
        System.out.format("%s=%s%n", envName, env.get(envName));
    }
}

IDEA 中的运行/调试配置如下所示:

当此片段在“包含父环境变量”复选框的情况下执行时,所有环境变量都会按预期打印,但是如果取消设置此复选框,则只会打印 SystemRoot var。

我没有注意到程序执行命令之间有任何区别:

"C:\Program Files\Java\jdk1.8.0_152\bin\java" -Dvisualvm.id=2058947361732085 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=3099:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;D:\Projects\untitled\out\production\untitled" com.myapp.Main

应用程序如何知道是否继承父环境变量?

从命令行运行应用程序时如何配置此类行为?

【问题讨论】:

  • ... 通过选中/取消选中该复选框。这就是它的用途

标签: java intellij-idea environment-variables


【解决方案1】:

在 IntelliJ 中运行应用程序时,有 2 个 Java 进程/VM

  1. 用于运行 IntelliJ 的 VM
  2. 用于运行您的应用程序的虚拟机

(1) 被认为是 (2) 的父级。从 IntelliJ 内部启动应用程序时,您可以使用上述复选框将 (1) 到 (2) 的任何环境变量传递。

这不适用于直接从命令行运行应用程序,因为只有一个 Java 进程/VM。

【讨论】:

  • 这个“继承”是怎么做的?我想自己测试一下。
  • 这不是真正的继承。 (1)中的所有系统属性都复制到(2)中
  • 我不知道 IDEA 是如何做到的,因为我没有阅读它的源代码,但我猜他们使用 java.lang.System 类和/或 -D&lt;name&gt;=&lt;value&gt; 参数987654323@进程
  • 它不适用于 -D= 因为在这种情况下我可以在启动字符串中看到这样的参数,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多