Exec-maven-plugin говорит, что не может запускать указанную программу, даже если она находится на PATH

Изменить 20140716:

Решение найдено

tl; dr = exec-maven-plugin не распознает файлы .cmd, а только файлы .bat в качестве исполняемых скриптов. Переименуйте grunt.cmd --> grunt.bat, bower.cmd --> bower.bat и т.д. В качестве обходного пути.


Сделав npm install -g grunt-cli в моей системе, grunt, безусловно, находится на PATH

Когда я запускаю maven install, это, похоже, не регистрируется.

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

Чтобы быть уверенным, в том же терминале я выполнил это

cd C:\workspace\foobar\src\main\spa
grunt build

... в том же терминале, что и я, вышедшая команда maven, и grunt выполняется просто отлично.

Использует ли exec-maven-plugin переменную окружения PATH, или вам нужно сказать, что этот исполняемый файл exisst каким-то другим способом?


РЕДАКТИРОВАТЬ:

Эта документация предполагает, что исполняемые файлы на PATH должны быть найдены, так что он претит меня дальше.

Ответ 1

В дополнение к ответу bguiz, который был бы лучшим решением, я создал обходное решение с использованием профилей Maven, минуя проблему.

Это временное решение, пока ошибка исправления maven-exec-plugin не будет исправлена.

Подтвердите отчет об ошибке здесь: http://jira.codehaus.org/browse/MEXEC-118

Изменить: Исправлена ​​ошибка, вы можете указать на 1.4-SNAPSHOT, чтобы исправить ее.

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

Ответ 2

Я выкопал исходный код exec-maven-plugin и нашел этот фрагмент.

Из источника 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 );
    }

Я сравнил это с другим плагином, который запускал задачи grunt из maven, и нашел это

        if (isWindows()) {
            command = "cmd /c " + command;
        }

... и это сработало для меня. По сути, последний работал, потому что все команды в WIndows были добавлены с помощью cmd /c, а exec-maven-plugin - нет, потому что он сделал это только для файла, заканчивающегося на .bat.

Глядя в C:\Users\USER\AppData\Roaming\npm, я вижу:

  • node_modules (папка)
  • grunt (файл unix script)
  • grunt.cmd (файл Windows script)

Когда я переименую grunt.cmdgrunt.bat, это решает проблему, и exec-maven-plugin может выполнить эту команду.

(это также относится к другим исполняемым файлам, созданным с помощью npm install -g, таких как bower и yo)

Ответ 3

У меня была такая же проблема с 1.5.0 плагина.

Причиной в моем случае были пробелы в имени пользователя, в результате чего был пробитый путь: C:\Users\Мое имя с пробелами\AppData\Роуминг\npm.

Когда я переместил содержимое каталога npm в путь без пробелов, он работал.