【问题标题】:How to force Java to reload environment variables如何强制 Java 重新加载环境变量
【发布时间】:2013-02-26 18:45:09
【问题描述】:

我有一个 java 程序,它通过 Runtime.getRuntime().exec(command) 启动一个 C 编译程序。此“命令”使用环境变量。

如果 java 程序仍在运行,但在调用 exec(command) 之前(由另一个外部进程)更改了 env 变量,则 C 程序仍将具有旧的 env 值。

似乎 C 程序正在从主 Java 进程获取它的环境,因为当 Java 进程重新启动时 env 值是正确的。有没有办法强制在 Java 进程中刷新 env 变量?

【问题讨论】:

  • 我认为这与 Java 没有任何关系——只是在启动子进程时如何重新加载环境变量。
  • @djechlin no OP 想要将更改后的环境加载到 Java 程序中
  • @Mark 但这是一个操作系统问题,Java 像任何其他程序一样获得它的环境
  • 我必须指出,说“环境变量已更改”是无稽之谈。 Changed 的​​意思是“相对于环境”,在这种情况下,“环境”的意思是“不同的”。那么你在什么环境下(很吵)听 env 变量的变化,到底为什么?
  • 澄清一下,我调用的 C 程序是供应商的程序,所以我无法控制它。我的 Java 代码对他的环境变量一无所知,也不应该关心。问题是它在 JVM 启动时出现,它从操作系统获取 env 值并在使用 runtime.exec 生成进程时传递这些 env 值。因此,生成的进程 A 使用 env 变量。当需要时进程 A 被终止并且进程 B 运行并最终更新了 env 变量。进程 A 再次重新启动。但是进程 A 的第二次启动没有看到进程 B 设置的更新值。

标签: java exec environment-variables


【解决方案1】:

不要使用环境变量。

您描述的行为是how environment variables work。您对进程环境所做的更改会传播到其子进程。但是,子进程所做的更改不会传播回父进程,任意进程也不会相互更新。

最简单的替代方法是将配置文件存储在众所周知的位置。

【讨论】:

  • 我希望我可以不使用 env 变量,但这是我正在生成的供应商程序,他是使用该变量的人(无法更改)。这是更新环境变量的第二个处理(也是供应商拥有的)。我们只是试图通过我们的 java 程序自动调用这两个 exe 的过程,而不是用户手动单击供应商的图标。
【解决方案2】:

您的 Java 应用程序可以在您启动 C 应用程序后立即存储环境变量的值,然后您使用将始终运行的线程类。这个线程类会一直检查环境变量是否发生了变化,这就是我们保存环境变量之前的值的原因,所以如果它发生了变化,那么你别无选择,只能通过运行时再次执行你的 C 程序。

例如:

//inside your thread
if (!envVar.equals(envVarPReviousValue)) { 
//execute again
Runtime.getRumtime().exec("C-app");
}

【讨论】:

  • 专用池线程。是的,我在工作中也有类似的要求,我们就这样解决了。它很有用,而且不像看起来那么重。
  • 如何检查环境变量是否发生了变化?我很确定这是荒谬的。
  • Java 应用程序是否能够真正检查子进程(通过 runtime.exec)是否更改了 env var?我的 java 程序调用了两个子进程,第一个进程读取并使用 env var,然后第二个进程在需要时更新了 env var。当需要运行第二个进程时,第一个进程被杀死,然后在第二个进程完成时重新启动。我的 Java 程序根本不使用 env var。两个子进程永远不会同时执行。
猜你喜欢
  • 2013-11-03
  • 2021-11-16
  • 2021-11-29
  • 2015-05-25
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2022-01-25
相关资源
最近更新 更多