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 в путь без пробелов, это сработало.