我有一个示例 Java 应用程序,需要在某些环境中指定 HTTP 代理。
当我尝试使用Oracle website上建议的参数来运行它时在 CMD(命令提示符)中它工作正常。
E:\>java -Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
System properties...
[...]
http.proxyHost=http://proxy.example.com
您可以看到应用程序已运行,并且在列出系统属性时,它正确收到了 http.proxyHost
属性。
但是,当我从 Powershell 运行此命令时,我得到以下信息:
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS E:\> java -Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
Error: Could not find or load main class .proxyHost=http:..proxy.example.com
这里似乎第一个“.”周围发生了某种破坏。从那时起,它将其余部分视为另一个论点。
如果参数被引用 - 例如-D"http.proxyHost"=http://proxy.example.com
- 然后在 Powershell 中就可以正常工作了。
谁能解释一下这种行为吗?
最佳答案
不幸的是,您在 PowerShell 中发现了一个错误,该错误至少存在于 v7.3.6(撰写本文时为当前版本):
看起来像 PowerShell 参数的东西在 .
(句点)处被分成两个 参数 - 即使参数应该简单被传递,假设调用了外部程序 - 请参阅 GitHub issue #6291 ;在您的情况下, -Dhttp.proxyHost=http://proxy.example.com
意外地传递为
-Dhttp .proxyHost=http://proxy.example.com
(注意.
之前的空格)
解决方法:
`
- 转义初始-
(或单独引用.
字符('.'
)或引用整个参数):java `-Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
或者,如Sergey Shu's answer所示,使用
--%
,stop-parsing symbol ,强制 PowerShell 传递所有参数,而不应用 PowerShell 的常用解析规则。- 警告:使用
--%
会产生重大副作用,特别是无法使用变量引用在命令中并且无法应用重定向 - 请参阅 this answer了解详情。
- 警告:使用
关于java - 通过 CMD 与 Powershell 执行 Java 命令时的差异 - 由句点 ("."引起),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60487766/