java - node - exec-maven-plugin dice que no se puede ejecutar el programa especificado, a pesar de que está en la RUTA
frontend-maven-plugin (3)
Editar 20140716 :
Solución encontrada
tl; dr = exec-maven-plugin no reconoce archivos .cmd
, sino solo archivos .bat
, como scripts ejecutables. Cambie el nombre de grunt.cmd --> grunt.bat
, bower.cmd --> bower.bat
, etc. como solución alternativa.
Después de haber hecho npm install -g grunt-cli
en mi sistema, grunt
es sin duda en la PATH
Sin embargo, cuando ejecuto maven install
, parece que esto no se registra.
[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.
Solo para estar seguro, en la misma terminal, he ejecutado esto
cd C:/workspace/foobar/src/main/spa
grunt build
... en la misma terminal que emití el comando maven anterior, y gruñido se ejecuta muy bien.
¿ exec-maven-plugin
usa la PATH
entorno PATH
, o necesita ser dicho que este ejecutable exista de alguna otra manera?
Esta documentación sugiere que se deben encontrar ejecutables en PATH
, por lo que me detiene aún más.
Busqué en el código fuente de exec-maven-plugin
y encontré este fragmento.
Desde la fuente 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 );
}
Comparé esto con otro plugin que ejecutó tareas de grunt de maven, y encontré esto
if (isWindows()) {
command = "cmd /c " + command;
}
... y eso funcionó para mí. Así que, esencialmente, el último funcionó porque todos los comandos en WIndows fueron antepuestos con cmd /c
, mientras que el exec-maven-plugin
no, porque solo lo hizo para el archivo que termina en .bat
.
Buscando en C:/Users/USER/AppData/Roaming/npm
, veo:
-
node_modules
(carpeta) -
grunt
(archivo de script de Unix) -
grunt.cmd
(archivo de script de Windows)
Cuando cambio el nombre de grunt.cmd
-> grunt.bat
, esto resuelve el problema y exec-maven-plugin
puede ejecutar este comando.
(Esto también se aplica a otros ejecutables creados usando npm install -g
, como bower
y yo
)
Además de la respuesta de bguiz, que sería la mejor solución, he creado una solución con los perfiles de Maven, eludiendo el problema.
Esta es una solución temporal, hasta que se solucione el error maven-exec-plugin.
Envíe por favor el informe de error aquí: http://jira.codehaus.org/browse/MEXEC-118
Editar: el error está resuelto, puede apuntar a 1.4-SNAPSHOT para solucionarlo.
<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>
Tuve el mismo problema con 1.5.0 del complemento.
La causa en mi caso eran espacios en mi nombre de usuario que daban como resultado una ruta grunt: C: / Users / Mi nombre con espacios / AppData / Roaming / npm.
Cuando moví los contenidos del directorio npm a una ruta sin espacios, funcionó.