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 переменная окружения, или нужно сказать, что этот исполняемый файл существует как-то иначе?


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

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

3 ответа

Решение

В дополнение к ответу 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>

Я копался в исходнике 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 );
    }

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

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

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

Ищу в C:\Users\USER\AppData\Roaming\npm, Я вижу:

  • node_modules (Папка)
  • grunt (файл сценария unix)
  • grunt.cmd (файл сценария Windows)

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

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

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

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

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

Другие вопросы по тегам