запуск mvn с использованием ProcessBuilder - PullRequest
2 голосов
/ 01 ноября 2011

Я создал класс, который создает процесс с использованием ProcessBuilder, а затем запускает процесс

ProcessBuilder pb = new ProcessBuilder("mvn","exec:java","-Dexec.mainClass="+"FunnyClass");

Теперь, когда я запускаю этот класс на Linux, он работает нормально, но в Windows он выдает ошибку, сообщая, что что-то вроде 'mvn' не найдено, мне нужно изменить на

ProcessBuilder pb = new ProcessBuilder
                       ("mvn.bat","exec:java","-Dexec.mainClass="+"FunnyClass");

Но если я запускаю команду в командной строке "mvn exec: java -Dexec.mainClass = FunnyClass", она работает нормально. Итак, почему мне нужно дать mvn.bat в процессе сборки.

Есть ли какое-то решение?

мое Java-приложение будет работать как на Windows, так и на Linux-системах, так что мне делать?

1 Ответ

3 голосов
/ 01 ноября 2011

Это происходит потому, что оболочка Windows (cmd) имеет особенность: она пытается добавить расширения exe, 'bat', 'cmd' к командной строке, которую вы запускаете.Как только он находит первое совпадение (то есть файл, который действительно существует в файловой системе), он запускает его.

В случае maven у вас есть скрипт оболочки Unix mvn, который не может быть выполнен в Windows и пакетном файле Windows '.bat'.Командная строка добавляет «.bat» к «mvn», который вы вводите в командной строке, видит, что файл существует, и запускает его.

Когда вы запускаете процесс из Java, у вас нет оболочки, поэтому никто не выполняет эту работу.Я бы посоветовал вам проверить операционную систему и удерживать команду для каждой ОС.Если вы хотите очистить решение, создайте файл ресурсов cmd.properties:

mvn.windows = mvn.bat
mvn.unix = mvn

Теперь проверьте ОС, используя системное свойство os.name, и создайте команду, используя данные из cmd.properties.

Альтернативное решение для запускакоманда, использующая cmd /c в windows и '/ bin / sh -c' в unix, но это ничего не упрощает, поэтому я бы избежал этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...