使用NodeJS,如何设置JAVA_HOME系统环境变量?

时间:2020-03-04 16:48:36

标签: java node.js windows java-home system-variable

我一直在尝试制作一个JAVA_HOME switcher 脚本,该脚本可以在开始执行特定的* .jar文件(一个与Java 1.8兼容,另一个与Java兼容)之前更改Java的版本。 11)。

到目前为止,我一直在尝试运行child_process.exec命令来调用Windows命令,例如:

  • SET JAVA_HOME="..."(应该仅在此会话中设置它,是非持久性的吗?)
  • SETX JAVA_HOME "..."(据说只有在此会话之后才设置,持久吗?)
  • refreshenv(不是现成的Windows,它是Chocolatey库附带的。)
  • where java,以查看它实际指向的Java版本。

每次运行脚本时,它似乎都不会更新JAVA_HOME路径,即使运行child_process.exec("refreshenv")之后也是如此。

但是,在节点命令完成后,我在控制台中手动输入refreshenv,然后输入where java,然后将其指向正确的版本。因此,就像节点脚本确实修改JAVA_HOME一样,但是只有在该过程结束后才真正生效。

如果我了解Node的 child_process 的运行方式,这是我的事...

每个单独的child_process.exec执行都在自己的shell中运行 isolated 进程。

意思是,对System Vars的任何修改只会在那些单独调用的上下文中影响它。是的,确实如此,SetX确实可以修改并保留,但是在 main NodeJS进程的上下文中[,因为它位于子进程之上],它不知道那些系统变量更改,因为它们发生在子进程中。几乎就像主要过程在其生命周期内保留System Vars的“快照”一样。

一旦主NodeJS进程结束并退出,从技术上SetX- -进行修改,但是直到手动运行refreshenv为止,您还无法注意到这些变化。这似乎是“推送”修改后的System Vars更改,最终将其永久提交。

有趣的是,如果我在一次exec(...)调用中将所有命令组合在一起(通过用&&分隔它们),那么我就可以获得正确的Java版本... 但仅在此期间一个exec(...)呼叫(仅在其上下文中)

所以...

是否有任何解决方案可以运行child_process.exec并立即保留这些更改,以便随后的exec调用都使用该更新的JAVA_HOME变量?在主要的NodeJS流程退出之后?

还是我必须给我所有的Java命令加上一堆 && SETSETX调用组合在一起的前缀?

0 个答案:

没有答案
相关问题