Impossible d’exécuter Maven en utilisant l’argument `mvn -D` dans Microsoft Powershell, mais fonctionne dans l’invite de commande

J’essaie de construire notre projet web à partir de la ligne de commande mais en évitant les tests. J’utilise la commande mvn clean install -Dmaven.test.skip=true .

Lorsque je lance la commande à partir de l’invite de commande traditionnelle en noir et blanc (aussi appelée shell DOS), la commande fonctionne, mais lorsque je l’exécute à partir de la commande “Windows PowerShell“, j’obtiens l’erreur suivante:

[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, comstack, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-comstack, 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]

Qu’est-ce qui cause cette divergence et comment puis-je faire en sorte que PowerShell se comporte comme l’invite de commande traditionnelle?

Cela fonctionne sous Windows 7.

Lorsque vous rencontrez des problèmes d’interprétation des arguments PowerShell à transmettre à un EXE de console, essayez d’utiliser l’utilitaire echoargs.exe fourni avec les extensions de communauté PowerShell . Avec cet outil, vous pouvez voir comment PowerShell fournit les arguments au fichier EXE, par exemple:

 PS> echoargs mvn clean install -Dmaven.test.skip=true Arg 0 is  Arg 1 is  Arg 2 is  Arg 3 is <-Dmaven> Arg 4 is <.test.skip=true> PS> echoargs mvn clean install '-Dmaven.test.skip=true' Arg 0 is  Arg 1 is  Arg 2 is  Arg 3 is <-Dmaven.test.skip=true> 

Réponse courte – utilisez les guillemets '-Dmaven.test.skip=true'

Selon ce fil d’email :

Généralement, si vous utilisez Powershell pour Maven, svn etc, vous devez échapper à tout argument commençant par un tiret (-). Le caractère d’échappement dans Powershell est un backtick. Donc vous vous retrouvez avec l’archétype mvn: créez -DgroupId = blah `-DartifactId = blah. , le caractère ‘-‘ est un caractère spécial qui doit être échappé lorsque vous lancez maven depuis la console Powershell.

Ce qui suit fonctionne pour moi

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

On dirait que le -D est une sorte de personnage spécial et nécessite une évasion.
Notez également que -X fonctionne correctement et ne nécessite pas de fuite. Notez l’utilisation de guillemets simples dans la commande replace, si vous utilisez des guillemets doubles (ie “), vous devez utiliser` `.

J’utilise Powershell 2.0 (2.0.1.1) sur Windows 7