Я пытался создать 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
вызовов?