PowerShellでjavaコマンドを使用する際に、
-Dオプションでシステムプロパティを設定しようとしたのですが、
エラーが起きてうまくいかなかったです。
例えば、下記のコマンドをPowerShellで実行すると、
java -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 -version
下記のエラーが発生します。
java.lang.ClassNotFoundException: /proxyHost=proxy/com
原因
原因は、
PowerShellでは-
の付いている引数がパラメータ名として解釈され、
さらにパラメータ名としては.
を含むことができず、
.
の前までがパラメータ名としてそれ以降の文字列と分割されてしまうため、
とのことです。
確かに、エラーを見ると、/proxyHost=proxy/com
というクラスを指定していることになっています。
これは、-Dhttp.proxyHost=proxy.com
の.proxyHost=proxy.com
の部分が-Dhttp
と分割されて、
オプションではなくjavaコマンドのメインクラスを指定する引数として解釈されてしまっているということだと思われます。
https://stackoverflow.com/questions/28704867/why-does-powershell-split-arguments-containing-hyphens-and-periods
解決策
解決策1
それぞれの-Dオプションを"
で囲むと問題なく実行できるようになります。
java "-Dhttp.proxyHost=proxy.com" "-Dhttp.proxyPort=8080" -version
解決策2
それぞれの-Dオプションの直前に`
を置くと問題なく実行できるようになります。
`
はPowerShellにおけるエスケープ文字らしいです。
java `-Dhttp.proxyHost=proxy.com `-Dhttp.proxyPort=8080 -version
解決策3
直接-Dオプションを書くときは、上記の解決策1または解決策2でも良いのですが、
私の場合、環境変数JAVA_OPTSに一連の-Dオプションを保存しています。
そのため、環境変数JAVA_OPTSを使って、下記のようにjavaコマンドを実行したいです。
java $Env:JAVA_OPTS -version
しかしながら、これでは最初と同様にエラーが発生してしまいます。
そこで、環境変数の中の文字列に対して、
解決策1または解決策2の解決策を適用します。
私の場合、下記記事を参考に解決策2を採用することにしました。
https://stackoverflow.com/questions/6347985/cannot-run-maven-using-mvn-d-argument-within-microsoft-powershell-but-works
具体的には、下記の手順でコマンドを実行するようにしました。
- コマンド全体を文字列として記述する。
- その文字列の
-D
を`-D
に置換する。
- 置換後の文字列をコマンドとして実行する。
上記手順をワンライナーにまとめたコマンドは下記のとおりです。
;
で2個のコマンドを区切ることで強引に1行にしています。
$command = "java $Env:JAVA_OPTS -version".replace('-D', '`-D'); Invoke-Expression $command
この解決策は、
Mavenのmvnコマンド(mvnwコマンド)を実行する際に-Dオプションを使用する際や、
Graldeのgradleコマンド(gradlewコマンド)を実行する際に-Dオプションを使用する際にも、
同様に適用できると思います。
最後に
最後に、PowerShellのバージョン情報($PSVersionTable の実行結果)
を記載しておきます。
Name Value
---- -----
PSVersion 7.0.8
PSEdition Core
GitCommitId 7.0.8
OS Microsoft Windows 10.0.19043
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PowerShellはbashと違うところが多く、
もっと勉強が必要だなと感じています。
読んでいただきありがとうございました。
それではまた!