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

изменить 20140716:

решение

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


сделал 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:workspacefoobarsrcmainspa"): 
    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:workspacefoobarsrcmainspa
grunt build

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

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


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

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

3 ответов


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

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

пожалуйста, upvote отчет об ошибке здесь:http://jira.codehaus.org/browse/MEXEC-118

Edit: ошибка устранена, вы можете указать на 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 );
    }

я сравнил это с другим плагином, который запускал задачи 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)
  • grunt.cmd (файл сценария windows)

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

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


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

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

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