のっかーのエンジニア日記

新人SEの日記です。

PowerShellでjavaコマンドの-Dオプションを使用できない問題

PowerShelljavaコマンドの-Dオプションを使用できない

PowerShelljavaコマンドを使用する際に、 -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

具体的には、下記の手順でコマンドを実行するようにしました。

  1. コマンド全体を文字列として記述する。
  2. その文字列の-D`-Dに置換する。
  3. 置換後の文字列をコマンドとして実行する。

上記手順をワンライナーにまとめたコマンドは下記のとおりです。 ;で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

PowerShellbashと違うところが多く、 もっと勉強が必要だなと感じています。

読んでいただきありがとうございました。 それではまた!