Разница при выполнении команды Java через CMD и Powershell - вызвана точками (".") - PullRequest
2 голосов
/ 02 марта 2020

У меня есть пример Java приложения, которое требует, чтобы в некоторых средах был указан прокси-сервер HTTP.

Когда я пытаюсь запустить его, используя аргумент, предложенный на веб-сайте Oracle в 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.

Может кто-нибудь объяснить это поведение, пожалуйста?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

К сожалению, вы видите ошибку в PowerShell , все еще присутствующую с v7.0:

Что-то, что похоже на параметр для PowerShell разбивается на два аргумента в . (точка) - даже если аргумент должен просто передаваться через , учитывая, что вызывается внешняя программа - см. этот выпуск GitHub ; в вашем случае -Dhttp.proxyHost=http://proxy.example.com неожиданно передается как -Dhttp .proxyHost=http://proxy.example.com (обратите внимание на пробел перед .)

Существует два обходных путей :

  • Цитировать символ ., используя '.' (или цитировать аргумент целом ):

    java -Dhttp'.'proxyHost=http://proxy.example.com -jar myJAR.jar
    
  • В качестве альтернативы , как показано в ответе Сергея Шу , используйте --%, символ остановки разбора , чтобы заставить PowerShell передавать все аргументы без применения обычных правил разбора PowerShell.

    • Предупреждение : Использование --% имеет серьезные побочные эффекты , в частности невозможность использования ссылок на переменные в команде и невозможность применения перенаправления - подробности см. в этом ответе .
1 голос
/ 02 марта 2020

man about_Parsing

попробуйте запустить из powershell с помощью параметра -%:

java --% -Dhttp.proxyHost=http://proxy.example.com -jar myJAR.jar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...