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.cmd
→ grunt.bat
, это решает проблему, и exec-maven-plugin
может выполнить эту команду.
(это также относится к другим исполняемым файлам, созданным с помощью npm install -g
, таких как bower
и yo
)
Ответ 3
У меня была такая же проблема с 1.5.0 плагина.
Причиной в моем случае были пробелы в имени пользователя, в результате чего был пробитый путь:
C:\Users\Мое имя с пробелами\AppData\Роуминг\npm.
Когда я переместил содержимое каталога npm в путь без пробелов, он работал.