Используя NodeJS, как я могу установить переменную системной среды JAVA_HOME? - PullRequest
0 голосов
/ 04 марта 2020

Я пытался создать JAVA_HOME switcher сценарий, который может изменить версию Java непосредственно перед тем, как он начнет выполнять указанные c * .jar файлы (один из которых Java 1.8 совместимый, другой для 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's child_process , вот мои мысли ...

Каждое отдельное child_process.exec выполнение запускает процесс изолированный в своей собственной оболочке.

То есть любые изменения в System Vars повлияет только на это в контексте этих отдельных вызовов. Да, правда, в частности, SetX действительно изменяет и сохраняет, но в контексте основного NodeJS процесса [, так как он выше дочерних процессов ], это не знает об этих изменениях System Vars, поскольку они происходят в дочерних процессах. Это похоже на то, как если бы основной процесс сохранял «снимок» системных переменных в течение всего срока службы.

Как только основной NodeJS процесс завершится и выйдет, технически SetX - сделал - внесите изменение, но вы не сможете заметить эти изменения, пока не выполните refreshenv вручную. Похоже, что "pu sh" измененные изменения System Vars, наконец, окончательно фиксируя их.

Интересно, если я объединю все команды вместе в одном вызове exec(...) (разделив их с &&) , ТОГДА я могу получить правильную Java версию ... НО только во время этого одного exec(...) вызова (только в его контексте) .

Итак ...

Есть ли какие-либо решения для запуска child_process.exec и фактического сохранения этих изменений немедленно, чтобы любые последующие вызовы exec использовали эту обновленную переменную JAVA_HOME? И после завершения основного NodeJS процесса?

Или я должен префиксировать все мои java команды с помощью набора && объединенных SET, SETX, refreshenv вызовов?

...