20140716を編集:
tl; dr = exec-maven-pluginはnot.cmd
ファイルを認識しますが、実行可能スクリプトとして.bat
ファイルのみを認識します。回避策として、grunt.cmd --> grunt.bat
、bower.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
の実行可能ファイルを見つける必要があることを示唆しているため、さらに困惑します。
最善の解決策である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>
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
でこのコマンドを実行できるようになります。
(これは、bower
やyo
など、npm install -g
を使用して作成された他の実行可能ファイルにも適用されます)
プラグインの1.5.0でも同じ問題が発生しました。
私の場合の原因は、ユーザー名にスペースが含まれていて、うなり声のパスが発生したことです:C:\ Users\My name with space\AppData\Roaming\npm。
Npmディレクトリの内容をスペースのないパスに移動すると、機能しました。