Используйте 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

Другие вопросы по тегам