Edit 20140716:
tl; dr = exec-maven-plugin ne pas reconnaît les fichiers .cmd
, mais uniquement les fichiers .bat
, en tant que scripts exécutables. Renommez grunt.cmd --> grunt.bat
, bower.cmd --> bower.bat
, etc. comme solution de contournement.
Ayant fait npm install -g grunt-cli
sur mon système, grunt
est très certainement sur PATH
Lorsque je lance maven install
cependant, cela ne semble pas s'enregistrer.
[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.
Juste pour être sûr, dans le même terminal, j'ai exécuté cette
cd C:\workspace\foobar\src\main\spa
grunt build
... dans le même terminal que j'ai émis la commande Maven ci-dessus, et Grunt s'exécute très bien.
exec-maven-plugin
utilise-t-il la variable d'environnement PATH
ou faut-il lui dire que cet exécutable existe d'une autre manière?
Cette documentation suggère que les exécutables sur PATH
soient trouvés, donc ça me stoppe davantage.
En plus de la réponse de bguiz, qui serait la meilleure solution, j'ai créé une solution de contournement à l'aide de profils Maven, en contournant le problème.
C'est une solution temporaire, jusqu'à ce que le bogue du plugin maven-exec-plugin soit corrigé.
Merci de voter le rapport de bogue ici: http://jira.codehaus.org/browse/MEXEC-118
Edit: Le bogue est résolu, vous pouvez pointer sur 1.4-SNAPSHOT pour le réparer.
<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>
J'ai creusé dans le code source de exec-maven-plugin
et trouvé cet extrait.
Depuis la source de 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 );
}
Je l'ai comparé à un autre plugin qui exécutait des tâches difficiles de maven, et j'ai trouvé ceci
if (isWindows()) {
command = "cmd /c " + command;
}
... et cela a fonctionné pour moi. Ce dernier fonctionnait donc essentiellement car toutes les commandes de Windows étaient précédées du préfixe cmd /c
, , Alors que le exec-maven-plugin
ne l’a pas été, car il ne l’a fait que pour les fichiers se terminant par .bat
.
En regardant dans C:\Users\USER\AppData\Roaming\npm
, je vois:
node_modules
(dossier)grunt
(fichier de script unix)grunt.cmd
(fichier de script Windows)Lorsque je renomme grunt.cmd
-> grunt.bat
, le problème est résolu et exec-maven-plugin
peut exécuter cette commande.
(Ceci s'applique également aux autres exécutables créés à l'aide de npm install -g
, tels que bower
et yo
)
J'ai eu le même problème avec 1.5.0 du plugin.
La cause dans mon cas était des espaces dans mon nom d'utilisateur résultant en un chemin grunt: C:\Utilisateurs\Mon nom avec des espaces\AppData\Roaming\npm.
Lorsque j'ai déplacé le contenu du répertoire npm vers un chemin sans espaces, cela a fonctionné.