У меня есть процесс Java, работающий в качестве сервера Windows, используя prcorun (http://commons.apache.org/proper/commons-daemon/); к сожалению, мне нужно запустить внешнюю устаревшую команду, написанную на C / C ++.
и то и другое
Process myProcess = Runtime.getRuntime().exec(command);
а также
Process myProcess = new ProcessBuilder(command, arg).start();
хорошо работают, когда java запускается как отдельное приложение, но когда я запускаю java как сервис, он отвечает
command not found
также с
Process myProcess = Runtime.getRuntime().exec("dir");
command not found
Я думаю, что это проблема из-за служб Windows.
Любое предложение?
Я попытался бы сделать быстрый тест и распечатать переменную окружения PATH в вашем сервисе. То, что я обычно обнаруживал, когда вы запускаете какую-то команду как службу, PATH может быть не полностью доступным (что также может объяснить, почему DIR не работает для вас). Если это так, при запуске службы вы должны убедиться, что PATH включает в себя как обычную корзину, так и вашу прежнюю корзину.
Как говорится в сообщении об ошибке, команда не найдена в пути. Вам нужно будет установить переменную окружения PATH для среды дочернего процесса. Посмотрите на метод exec (cmd, String [] env). Вы можете создать массив переменных среды (пары ключ-значение) и передать его в exec ().
В моем случае я использовал
cmd /c <<YOUR COMMAND>>
например.
Процесс myProcess = Runtime.getRuntime (). Exec («cmd / c dir»);
также я добавил среду. как предложено smurf
private static String[] getEnv() {
Map<String, String> env = System.getenv();
String[] envp = new String[env.size()];
int i = 0;
for (Map.Entry<String, String> e : env.entrySet()) {
envp[i++] = e.getKey() + "=" + e.getValue();
}
return envp;
}
…
Process myProcess = Runtime.getRuntime().exec("cmd /c dir",getEnv());
Альтернатива java.lang.Runtime.exec (), которая может выполнять командные строки как одну строку?