Я пытаюсь пробежать npm через ProcessBuilder.start(). Однако, по крайней мере, в Windows всякий раз, когда я пытаюсь запустить процесс, не указывая полный путь к исполняемому файлу, вызов завершается с ошибкой «CreateProcess = 2».
Обновлено: каталог npm находится в переменной среды PATH.
Образец кода:
public class Main {
public static void main(String[] args) {
// Won't work
invokeCommand(new String[] {"npm", "--version"});
// Will work
invokeCommand(new String[] {"C:\\Program Files\\nodejs\\npm.cmd", "--version"});
}
private static void invokeCommand(String[] args) {
System.out.println("INVOKING: " + String.join(" ", args));
ProcessBuilder pb = new ProcessBuilder(args);
try {
Process p = pb.start();
p.waitFor();
dumpStdout(p);
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println();
}
private static void dumpStdout(Process p) throws IOException {
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println("STDOUT: " + line);
}
reader.close();
}
}
Почему это так? Это потому, что npm — это пакетная команда? Это очень неудобно, если не сказать несовместимо с другими программами, такими как java или node, которые прекрасно работают без полных путей. Спасибо.
@user85421 user85421 Я бы старался избегать этого, потому что программа будет работать на разных ОС, но это выглядит как незначительный компромисс.
Я думаю, что "C:\\Program Files\\nodejs\\npm.cmd" так же плохо, если не хуже, с точки зрения зависимости от ОС... просто попросили попробовать, неважно




Java сканирует Path на наличие исполняемых файлов, но не ссылается на переменную PATHEXT. Поэтому измените программу запуска, указав расширение исполняемого файла, поэтому оно работает с добавлением «.cmd».
Он будет работать с расширением {"npm.cmd", "--version"} или без расширения, если вы используете терминал, например {"cmd.exe", "/c", yourcommand}, поскольку CMD сканирует расширения файлов в переменной среды PATHEXT. Обычно устанавливается:
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
Спасибо. Вероятно, мне придется убедиться, что в Windows добавлено правильное расширение файла; это несколько нежелательно, но это не большая проблема.
ты пробовал
"npm.cmd"?