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