无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行
Posted
技术标签:
【中文标题】无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行【英文标题】:Cannot run Maven using `mvn -D` argument within Microsoft Powershell, but works in Command Prompt 【发布时间】:2011-09-14 22:25:31 【问题描述】:我正在尝试从命令行构建我们的 Web 项目,但跳过了测试。我正在使用命令mvn clean install -Dmaven.test.skip=true
。
当我从传统的黑白命令提示符(又名 DOS shell)运行命令时,该命令有效,但是当我从“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 的参数的解释问题时,请尝试使用 PowerShell Community Extensions 附带的 echoargs.exe
实用程序。使用此工具,您可以了解 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'
【讨论】:
刚刚碰到这个。在 '=' 和 '.' 上拆分参数有什么可能的原因?对我来说似乎完全愚蠢。 好答案。知道为什么 powershell 在第一个时期分裂 -Dmaven.test.skip=true 而不是后续时期吗? 是否有必要对所有出现的 args 破折号使用反引号,还是 Maven 特定的?这也适用于 git dash 命令吗? 当我遇到特定于 Windows 的问题时,这让我很伤心 另一种方法是使用--%
运算符,这会使Windows 上的PowerShell 解析得更像cmd.exe。请注意,您不会获得 $var
替换等 PS 功能。如果您需要 var 替换,您可以使用 env vars 例如:$env:SKIPTEST='true'; mvn --% clean install -Dmaven.test.skip=%SKIPTEST%
【参考方案2】:
以下对我有用。
$mvnArgs1 ="mvn test -X -Dmaven.test.skip=true".replace('-D','`-D')
Invoke-Expression $mvnArgs1
看起来 -D 是一种特殊字符,需要转义。 另请注意,–X 可以正常工作并且不需要转义。 注意替换命令中使用单引号,如果使用双引号(即“),则需要使用``。
我在 Windows 7 上使用 Powershell 2.0 (2.0.1.1)
【讨论】:
【参考方案3】:根据this email thread:
通常,如果您使用 Powershell for Maven、svn 等,您最终会 必须转义以破折号 (-) 开头的任何参数。这 Powershell 中的转义字符是一个反引号。所以你最终得到 mvn 原型:创建`-DgroupId=blah`-DartifactId=blah。 , '-' 是一个 运行时需要用反引号转义的特殊字符 来自 Powershell 控制台的 maven。
【讨论】:
以上是关于无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行的主要内容,如果未能解决你的问题,请参考以下文章
将SharePoint Online Client组件(Microsoft.SharePoint.Client)与powershell 2.0一起使用
Microsoft Office setup找不到powershell
无法在 PowerShell 中使用 REST API 删除 DevOps 分支