Как правильно запустить файл .bat из Java под службы Windows? - PullRequest
0 голосов
/ 10 февраля 2011

Из моего проекта Java я хочу запустить внешний .bat файл в другом потоке. Для этого я использую следующий метод:

    private void posAppRunner(final String path[], final Class targetClass) {
    new Thread(new Runnable() {
        public void run() {
            try {
                String line;
                Process p = Runtime.getRuntime().exec(path);
                BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
                input.close();
            } catch (IOException e) {
                LogFactory.getLog(targetClass).warn("Error when starting a PosApplication: " + e.getMessage());
            }
        }

    }).start();

Я запускаю следующий файл .bat:

call chdir %~dp0

start java <_some_arguments>

Поэтому, когда я делаю это локально из IntelliJ IDEA, все работает правильно - появляется процесс cmd, после этого появляется процесс java, а после этого процесс cmd исчезает.

Но когда я запускаю свой проект Java с помощью этого метода через ANT в службе Windows TeamCity, появляется только процесс cmd, и после этого ничего не происходит. Процесс Java, который должен быть запущен из файла bat, не отображается. Похоже, я не читаю вывод процесса, но я читаю!

Не могли бы вы объяснить мне, как преодолеть эту ситуацию?

1 Ответ

0 голосов
/ 10 февраля 2011

Я считаю, что проблема в текущем рабочем каталоге. Я не очень знаком с файлами bat и не помню наизусть, что означает %~dp0. Во всяком случае, в качестве первой попытки попробуйте изменить командный файл, чтобы он содержал жестко заданный путь Я верю, что это сработает.

В этом случае решите, что лучше для вас: найдите путь в коде Java, а затем передайте его в пакетный файл, сгенерируйте пакетный файл на лету, чтобы он содержал все параметры, жестко запрограммированные, или отладьте сценарий. например, вы можете удалить start java <_some_arguments> и поставить

echo %~dp0 > c:\temp\batlog.log

это напечатает параметр в файл журнала. Теперь запустите его как сервис и посмотрите, что содержит файл журнала. Возможно, вы сразу увидите проблему.

...