使用exec-maven-plugin在Windows上执行shell脚本

时间:2017-09-21 15:31:05

标签: java windows shell maven exec-maven-plugin

我有一个使用exec-maven-plugin执行带有三个参数的shell脚本的pom。运行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中运行此命令,它会成功完成,使用正确的参数执行shell脚本。即使使用cmd.exe,我也可以执行此脚本。

但是使用Maven构建项目,每次都失败了。我甚至清空了shell脚本,因此它实际上由以下内容组成:

#!/bin/sh
echo "hello world"

虽然真正的原始shell脚本确实需要三个参数,但我得到完全相同的错误消息,关于%1不是有效的Win32应用程序,并且此脚本不接受任何参数,也不尝试引用任何参数;它只是呼应“你好世界”。

我注意到各种参数中的斜线是混合的,我不确定这是罪魁祸首;尝试在Maven上从Windows执行shell脚本似乎更多。

任何人都可以帮助我并解释发生了什么吗?如果需要任何其他详细信息,请告诉我,我将提供更多背景信息。

3 个答案:

答案 0 :(得分:3)

您的命令行是*:

[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更改为那个感到满意。

一种可能的解决方案应该是安装&#34; Windows Subsystem For Linux&#34;。

另一个解决方案是创建一个包含以下内容的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中有一个sh.bat:

c:\cygwin\bin\run.exe sh %*

*我省略了文件夹以提高可读性

答案 1 :(得分:0)

尝试使用cmd作为可执行文件,然后使用/C作为第一个参数,将shell脚本的路径名作为下一个参数,然后是其余参数:

            <executable>cmd</executable>
            <arguments>
                <argument>/C</argument>
                <argument>${project.basedir}/src/main/scripts/dependencies.sh</argument>

答案 2 :(得分:0)

由于Cygwin提供了cygwin\bin可执行文件,因此我将%PATH%路径添加到Windows 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的Windows子系统,而不是Cygwin)来自动在Windows%PATH%上提供bash可执行文件,并与 .pom < / em>已配置