web-dev-qa-db-fra.com

exec-maven-plugin indique qu'il est impossible d'exécuter le programme spécifié, même s'il se trouve sur le chemin d'accès

Edit 20140716:

Solution trouvée

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.

11
bguiz

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>
6
Piet van Dongen

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)

9
bguiz

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é.

0
Yves