Не удается запустить Maven с использованием аргумента `mvn -D` в Microsoft Powershell, но работает в командной строке
Я пытаюсь построить наш веб-проект из командной строки, но пропуская тестирование. Я использую команду mvn clean install -Dmaven.test.skip=true
.
Когда я запускаю команду из традиционной черно-белой командной строки (так называемой оболочки DOS), команда работает, но когда я запускаю ее из команды из "Windows PowerShell", я получаю следующую ошибку:
[ERROR] Unknown lifecycle phase ".test.skip=true". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-
artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources,
compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepar
e-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy, pre-clean, clean, po
st-clean. -> [Help 1]
Что вызывает это несоответствие и как заставить PowerShell вести себя как традиционная командная строка?
Это работает в Windows 7.
Ответы
Ответ 1
При возникновении проблем с интерпретацией аргументов PowerShell, передаваемых в консоль EXE, попробуйте использовать утилиту echoargs.exe
, которая поставляется с Расширения сообщества PowerShell. С помощью этого инструмента вы можете увидеть, как PowerShell поставляет аргументы в EXE, например:
PS> echoargs mvn clean install -Dmaven.test.skip=true
Arg 0 is <mvn>
Arg 1 is <clean>
Arg 2 is <install>
Arg 3 is <-Dmaven>
Arg 4 is <.test.skip=true>
PS> echoargs mvn clean install '-Dmaven.test.skip=true'
Arg 0 is <mvn>
Arg 1 is <clean>
Arg 2 is <install>
Arg 3 is <-Dmaven.test.skip=true>
Короткий ответ - используйте цитирование '-Dmaven.test.skip=true'
Ответ 2
Для меня работает следующее.
$mvnArgs1 ="mvn test -X -Dmaven.test.skip=true".replace('-D','`-D')
Invoke-Expression $mvnArgs1
Похоже, что -D является своего рода особым символом и требует экранирования.
Также обратите внимание, что -X отлично работает и не требует экранирования.
Обратите внимание на использование одиночной кавычки в команде replace, если вы используете двойные кавычки (т.е. "), Вам нужно использовать`..
Я использую Powershell 2.0 (2.0.1.1) для Windows 7
Ответ 3
В соответствии с этот поток электронной почты:
Как правило, если вы используете Powershell для Maven, svn и т.д., вы в конечном итоге чтобы избежать любых аргументов, начинающихся с тире (-). escape-персонаж в Powershell - это обратная сторона. Таким образом, вы получаете mvn archetype: create `-DgroupId = blah` -DartifactId = blah., '-' является специальный символ, который должен бежать с обратной отметкой при запуске maven из консоли Powershell.