Используйте exec-maven-plugin для запуска сценария оболочки в Windows
У меня есть pom, который использует exec-maven-plugin для выполнения сценария оболочки с тремя параметрами. При беге mvn clean install -X -e
, на этом этапе происходит сбой с ошибкой,
[DEBUG] Toolchains are ignored, 'executable' parameter is set to C:\dev\intellij\projects\project-in-question\driver/src/main/scripts/dependencies.sh
[DEBUG] Executing command line: [C:\dev\intellij\projects\project-in-question\driver\src\main\scripts\dependencies.sh, C:\dev\intellij\projects\project-in-question\driver\target/project-in-question.dependencies, C:\dev\intellij\projects\project-in-question\driver\target, third-parameter]
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (dependencies) on project project-in-question: Command execution failed.: Cannot run program "C:\dev\intellij\projects\project-in-question\driver\src\main\scripts\dependencies.sh" (in directory "C:\dev\intellij\projects\project-in-question\driver"): CreateProcess error=193, %1 is not a valid Win32 application -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (dependencies) on project project-in-question: Command execution failed.
Соответствующая часть pom.xml:
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<executions>
<execution>
...
</execution>
<execution>
<id>dependencies</id>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<workingDirectory>${project.basedir}</workingDirectory>
<executable>${project.basedir}/src/main/scripts/dependencies.sh</executable>
<arguments>
<argument>${project.build.directory}/${project.artifactId}.dependencies</argument>
<argument>${project.build.directory}</argument>
<argument>project-in-question</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Я чувствую, что это может быть связано с операционными системами, где я (единственный) работаю на Windows 10 x64, а другие на Mac. Если я запускаю эту команду в Cygwin, она успешно завершается, выполняя сценарий оболочки с правильными параметрами. Даже с cmd.exe я могу выполнить этот скрипт.
Но при построении проекта с использованием Maven он терпит неудачу каждый раз. Я даже опустошил скрипт оболочки, так что он буквально состоял из следующего:
#!/bin/sh
echo "hello world"
В то время как настоящий оригинальный скрипт оболочки принимает три параметра, я получаю точно такое же сообщение об ошибке, что%1 не является допустимым приложением Win32, и этот скрипт не принимает никаких аргументов и не пытается ссылаться на них; это просто повторяет "привет мир".
Я заметил, что косые черты в различных параметрах смешаны, и я не уверен, что это виновник; Похоже, это больше связано с попыткой выполнения сценария оболочки в Windows от Maven.
Может кто-нибудь помочь мне с этим и объяснить, что происходит? Если понадобятся какие-либо дополнительные детали, просто дайте мне знать, и я предоставлю больше контекста.
2 ответа
Ваша командная строка *:
[dependencies.sh, project-in-question.dependencies, target, third-parameter]
Но на Windows dependencies.sh
не является исполняемым файлом Чтобы запустить его с Cygwin, вы должны запустить его так: *
[c:\cygwin\bin\run.exe, dependencies.sh, project-in-question.dependencies, target, third-parameter]
Теперь я предполагаю, что другие не будут рады изменить pom.xml на это.
Одним из возможных решений должно быть установить " Подсистема Windows для Linux".
Другим решением было бы создать файл dependencies.sh.bat, содержащий что-то вроде:
c:\cygwin\bin\run.exe dependencies.sh %*
но с этим решением вам, вероятно, придется переименовать файл dependencies.sh на вашем компьютере, чтобы Windows сначала выбрал файл.bat.
Другим компромиссом может быть изменение исполнения на
<executable>sh</executable>
<arguments>
<argument>-c</argument>
<argument>${project.basedir}/src/main/scripts/dependencies.sh ${project.build.directory}/${project.artifactId}.dependencies ${project.build.directory} project-in-question</argument>
И в вашей системе есть ш.бат в вашем PATH
с:
c:\cygwin\bin\run.exe sh %*
* Я опустил папки для лучшей читаемости
Попробуйте использовать cmd
как ваш исполняемый файл, а затем /C
в качестве первого аргумента и пути вашего сценария оболочки в качестве следующего аргумента, за которым следуют остальные аргументы:
<executable>cmd</executable>
<arguments>
<argument>/C</argument>
<argument>${project.basedir}/src/main/scripts/dependencies.sh</argument>
Я бы добавил cygwin\bin
путь к Windows %PATH%
переменная окружения, поскольку Cygwin предоставляет bash.exe
исполняемый файл. Затем измените .pom, чтобы он не зависел от платформы:
...
<execution>
<id>dependencies</id>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<workingDirectory>${project.basedir}</workingDirectory>
<executable>bash</executable>
<arguments>
<argument>${project.basedir}/src/main/scripts/dependencies.sh</argument>
<argument>${project.build.directory}/${project.artifactId}.dependencies</argument>
<argument>${project.build.directory}</argument>
<argument>project-in-question</argument>
</arguments>
</configuration>
</execution>
...
Как отметил @Samuel Kirschner выше, вы также можете использовать подсистему Windows для Linux (WSL) вместо Cygwin, которая автоматически предоставляет bash
исполняемый файл в Windows %PATH% и работает с заданной конфигурацией .pom