Search code examples
windowscommand-linepowershellmavencommand

Cannot run Maven using `mvn -D` argument within Microsoft Powershell, but works in Command Prompt


I am trying to build our web project from the commandline but skipping the testing. I am using the command mvn clean install -Dmaven.test.skip=true.

When I run the command from the traditional black & white Command Prompt (aka DOS shell) the command works, but when I run it from the command from "Windows PowerShell" I get the following error:

[ERROR] Unknown lifecycle phase ".test.skip=true". You must specify a valid lifecycle phase or a goal in the format : or :[:]:. 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, post-clean. -> [Help 1]`

What is causing this discrepancy and how do I get PowerShell to behave like the traditional Command Prompt?

This is running on Windows 7.


Solution

  • When you run into problems with PowerShell's interpretation of arguments to be passed to a console EXE, try using the echoargs.exe utility that comes with the PowerShell Community Extensions. With this tool you can see how PowerShell supplies the arguments to the EXE e.g.:

    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>
    

    Short answer - use quoting '-Dmaven.test.skip=true'