Edit 20140716:
tl; dr = exec-maven-plugin erkennt nicht .cmd
-Dateien, sondern nur .bat
-Dateien als ausführbare Skripte. Benennen Sie grunt.cmd --> grunt.bat
, bower.cmd --> bower.bat
usw. als Problemumgehung um.
Nachdem npm install -g grunt-cli
auf meinem System ausgeführt wurde, befindet sich grunt
mit Sicherheit auf der PATH
.
Wenn ich maven install
ausführe, scheint sich dies jedoch nicht zu registrieren.
[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.
Nur um sicherzugehen, habe ich dies im selben Terminal ausgeführt
cd C:\workspace\foobar\src\main\spa
grunt build
... im selben Terminal, in dem ich den obigen Maven-Befehl ausgeführt habe, und das Grunzen funktioniert einwandfrei.
Verwendet exec-maven-plugin
die Umgebungsvariable PATH
oder muss mitgeteilt werden, dass diese ausführbare Datei auf andere Weise vorhanden ist?
Diese Dokumentation schlägt vor, dass ausführbare Dateien auf PATH
gefunden werden sollten, sodass es mich weiter überrumpelt.
Zusätzlich zur Antwort von bguiz, die die beste Lösung wäre, habe ich eine Problemumgehung mit Maven-Profilen erstellt, die das Problem umgeht.
Dies ist eine vorübergehende Lösung, bis der Fehler des Maven-Exec-Plugins behoben ist.
Bitte stimmen Sie den Fehlerbericht hier hoch: http://jira.codehaus.org/browse/MEXEC-118
Edit: Der Fehler ist behoben, Sie können auf 1.4-SNAPSHOT zeigen, um ihn zu beheben.
<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>
Ich habe mich im Quellcode von exec-maven-plugin
umgesehen und dieses Snippet gefunden.
Aus der Quelle von 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 );
}
Ich habe dies mit einem anderen Plugin verglichen, das Grunt-Tasks von Maven ausgeführt hat, und habe das gefunden
if (isWindows()) {
command = "cmd /c " + command;
}
... und das hat bei mir funktioniert. Letztere funktionierten also im Wesentlichen, weil allen Befehlen in Windows cmd /c
vorangestellt wurde, wohingegen der exec-maven-plugin
dies nicht tat, da dies nur für Dateien mit der Endung .bat
der Fall war.
Wenn ich in C:\Users\USER\AppData\Roaming\npm
schaue, sehe ich:
node_modules
(Ordner)grunt
(Unix-Skriptdatei)grunt.cmd
(Windows-Skriptdatei)Wenn ich grunt.cmd
-> grunt.bat
umbenenne, wird das Problem behoben und exec-maven-plugin
kann diesen Befehl ausführen.
(Dies gilt auch für andere ausführbare Dateien, die mit npm install -g
erstellt wurden, z. B. bower
und yo
.)
Ich hatte das gleiche Problem mit 1.5.0 des Plugins.
Die Ursache in meinem Fall waren Leerzeichen in meinem Benutzernamen, die zu einem Grunzpfad führten: C:\Users\My name mit Leerzeichen\AppData\Roaming\npm.
Als ich den Inhalt des npm-Verzeichnisses in einen Pfad ohne Leerzeichen verschoben habe, hat es funktioniert.