web-dev-qa-db-ja.com

exec-maven-pluginは、PATH上にあるのに、指定されたプログラムを実行できないと言っています

20140716を編集

解決策が見つかりました

tl; dr = exec-maven-pluginはnot.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-pluginPATH環境変数を使用しますか、それともこの実行可能ファイルが他の方法で存在することを通知する必要がありますか?


この documentation は、PATHの実行可能ファイルを見つける必要があることを示唆しているため、さらに困惑します。

11
bguiz

最善の解決策であるbguizの回答に加えて、問題を回避して、Mavenプロファイルを使用して回避策を作成しました。

これは、maven-exec-pluginのバグが修正されるまでの一時的な解決策です。

ここでバグレポートに賛成してください: 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>
7
Piet van Dongen

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タスクを実行する別のプラグインと比較しました、そして これを見つけました

        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でこのコマンドを実行できるようになります。

(これは、boweryoなど、npm install -gを使用して作成された他の実行可能ファイルにも適用されます)

9
bguiz

プラグインの1.5.0でも同じ問題が発生しました。

私の場合の原因は、ユーザー名にスペースが含まれていて、うなり声のパスが発生したことです:C:\ Users\My name with space\AppData\Roaming\npm。

Npmディレクトリの内容をスペースのないパスに移動すると、機能しました。

0
Yves