Подтвердить что ты не робот

Не удается запустить 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.

4b9b3361

Ответ 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.