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

WindowsCommand LinePowershellMavenCommand

Windows Problem Overview


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 <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]

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

This is running on Windows 7.

Windows Solutions


Solution 1 - Windows

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'

Solution 2 - Windows

According to this email thread:

> Generally if you are using Powershell for Maven, svn etc you end up > having to escape any arguments which start with a dash (-). The > escape character in Powershell is a backtick. So you end up with mvn > archetype:create `-DgroupId=blah `-DartifactId=blah. , the '-' is a > special character that needs escaping with a back-tick when you run > maven from Powershell console.

Solution 3 - Windows

The following works for me.

$mvnArgs1 ="mvn test -X -Dmaven.test.skip=true".replace('-D','`-D')
Invoke-Expression $mvnArgs1

It looks like the -D is a kind of a special character and requires escaping.
Note also that –X works fine and does not require escaping. Note the use of single quote in the replace command, if you use double quotes (i.e. ") you need to use ``.

I am using Powershell 2.0 (2.0.1.1) on windows 7

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSledView Question on Stackoverflow
Solution 1 - WindowsKeith HillView Answer on Stackoverflow
Solution 2 - WindowskatrashView Answer on Stackoverflow
Solution 3 - WindowsHaim RamanView Answer on Stackoverflow