web-dev-qa-db-de.com

laut exec-maven-plugin kann das angegebene Programm nicht ausgeführt werden, obwohl es sich auf dem Pfad befindet

Edit 20140716:

Lösung gefunden

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.

11
bguiz

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

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

9
bguiz

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.

0
Yves