exec-maven-plugin说无法运行指定的程序,即使它在PATH上

时间:2014-03-14 00:22:13

标签: java node.js maven path maven-plugin

编辑20140716

Solution found

tl; dr = exec-maven-plugin 识别.cmd个文件,但仅识别.bat个文件,作为可执行脚本。重命名grunt.cmd --> grunt.batbower.cmd --> bower.bat等作为解决方法。


在我的系统上完成npm install -g grunt-cli后,grunt肯定会PATH

但是,当我运行maven install时,似乎没有注册。

    [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec 
    (build-spa-bower) on project foobar: Command execution failed. 
    Cannot run program "grunt" (in directory "C:\workspace\foobar\src\main\spa"): 
    CreateProcess error=2, The system cannot find the file specified -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: 
    Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec 
    (build-spa-bower) on project foobar: Command execution failed.

可以肯定的是,在同一个终端,我已经执行了这个

cd C:\workspace\foobar\src\main\spa
grunt build

...在我发出上面的maven命令的同一个终端中,grunt执行得很好。

exec-maven-plugin是否使用PATH环境变量,还是需要以其他方式告知此可执行文件是否存在?


编辑:

documentation表明应该找到PATH上的可执行文件,因此它会让我更进一步。

3 个答案:

答案 0 :(得分:9)

我挖掘了exec-maven-plugin的源代码并找到了这个代码段。

来自ExecMojo#getExecutablePath的来源:

    CommandLine toRet;
    if ( OS.isFamilyWindows() && exec.toLowerCase( Locale.getDefault() ).endsWith( ".bat" ) )
    {
        toRet = new CommandLine( "cmd" );
        toRet.addArgument( "/c" );
        toRet.addArgument( exec );
    }
    else
    {
        toRet = new CommandLine( exec );
    }

我将此与另一个从maven运行grunt任务的插件进行了比较,found this

        if (isWindows()) {
            command = "cmd /c " + command;
        }

......这对我有用。所以基本上后者是有效的,因为WIndows中的所有命令都以cmd /c为前缀, 而exec-maven-plugin没有,因为它只对文件以.bat结尾。

查看C:\Users\USER\AppData\Roaming\npm,我看到了:

  • node_modules(文件夹)
  • grunt(unix脚本文件)
  • grunt.cmd(Windows脚本文件)

当我重命名grunt.cmd - > grunt.bat,这解决了问题,exec-maven-plugin能够运行此命令。

(这也适用于使用npm install -g创建的其他可执行文件,例如boweryo

答案 1 :(得分:7)

除了bguiz的答案,这将是最好的解决方案,我已经使用Maven配置文件创建了一个解决方法,绕过了这个问题。

这是一个临时解决方案,直到maven-exec-plugin的bug得到修复。

请在此处上传错误报告:http://jira.codehaus.org/browse/MEXEC-118

编辑:错误已解决,您可以指向1.4-SNAPSHOT进行修复。

<project>
(...)
    <profiles>
        <profile>
            <id>grunt-exec-windows</id>
            <activation>
                <os>
                    <family>Windows</family>
                </os>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>${exec-maven-plugin.version}</version>
                        <executions>
                            <execution>
                                <id>grunt-default</id>
                                <phase>generate-resources</phase>
                                <configuration>
                                    <executable>cmd</executable>
                                    <arguments>
                                        <argument>/C</argument>
                                        <argument>grunt</argument>
                                    </arguments>
                                </configuration>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

答案 2 :(得分:0)

我对1.5.0的插件遇到了同样的问题。

我的案例中的原因是我的用户名中的空格导致了一个grunt路径: C:\ Users \我的名字包含spaces \ AppData \ Roaming \ npm。

当我将npm目录的内容移动到没有空格的路径时,它可以工作。