Groovy / Java Process не сообщает значение выхода .bat - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь написать обертку Groovy для скрипта Apache Servicemix client.bat (Groovy 2.5, Apache Servicemix 7.0.1), чтобы программно выдавать команды комплекта karaf, такие как start, stop, list и т. Д.

Итак, я начал с установки Servicemix по умолчанию и разработал простой пакет, который мне удалось установить и удалить вручную с помощью сценария client.bat.

Затем я написал простой скрипт для автоматизации установки

String cmd = 'e:/apache-servicemix-7.0.1/bin/client.bat bundle:install ' +
    "'file:///C:/valid/bundle/jar"

def sout = new StringBuilder(), serr = new StringBuilder()
println cmd
Process proc = cmd.execute()
proc.waitForProcessOutput(sout, serr)
int exitValue = proc.waitFor()
println "Exiting with ${exitValue}"
println "out> $sout"
println "err> $serr"

При условии правильного комплекта скрипт хорошо играет и устанавливает комплект. Однако если я укажу недопустимый пакет (например, несуществующий файл), код выхода будет равен 0, а на выходе будет отображена ошибка

E:\test\serviceMix>groovy bundle_install_fail.groovy
e:/apache-servicemix-7.0.1/bin/client.bat bundle:install 'file:///C:/unvalid/bundle/jar'
Exiting with 0
out> Bundle IDs:
Error executing command: Error installing bundles:
    Unable to install bundle file:///C:/unvalid/bundle/jar

err>

Обратите внимание: если я запускаю команду client.bat прямо из поля dos, эта же команда завершается с уровнем ошибки 1. Вместо этого скрипт Groovy сообщает об успешном выполнении (proc.waitFor возвращает 0). Так как client.bat является оберткой для java-программы, я решил вызвать непосредственно java-программу с соответствующими параметрами. В этом случае Groovy сообщает правильный уровень ошибки. Поскольку я должен выполнить несколько таких интеграций, я хотел бы найти решение для использования сценария, предоставляемого пакетом, поскольку это было бы проще для реализации и более удобным в перспективе.

...