web-dev-qa-db-ja.com

複数のシステムプロパティJavaコマンドラインを設定する

複数の-Dステートメントを使用するよりも、コマンドラインで複数のシステムプロパティをJavaプログラムに指定する簡単な方法はありますか?

これを回避しようとしています:

 Java -jar -DNAME="myName" -DVERSION="1.0" -DLOCATION="home" program.jar

1つの-Dとその後に引用符で囲まれた文字列を使用している人の例を見たことがあると思いましたが、その例はもう見つかりません。

59
Tyler DeWitt

答えはNOです。誰かが次のようなものを設定する例を見たかもしれません:

-DArguments=a=1,b=2,c=3,d=4,e=cow

次に、アプリケーションはArgumentsプロパティ文字列の値を解析して個々の値を取得します。 mainでキー値を取得できます(入力形式が保証されている場合):

String line = System.getProperty("Arguments");
if(line != null) {
  String str[] = line.split(",");
    for(int i=1;i<str.length;i++){
        String arr[] = str[i].split("=");
        System.out.println("Key = " + arr[0]);
        System.out.println("Value = " +  arr[1]);
    }
}

また、-Dはメインクラスの前、またはJavaコマンドラインのjarファイルの前にある必要があります。例:Java -DArguments=a=1,b=2,c=3,d=4,e=cow MainClass

50
ring bearer

プロパティを引数として渡す代わりに、プロパティを保存するために.propertiesを使用できます。

15
Dimitri

Documentation には、そのようなことについて言及しているものは何もありません。

引用は次のとおりです。

-Dproperty = valueシステムプロパティ値を設定します。値がスペースを含む文字列の場合、文字列を二重引用符で囲む必要があります。

Java -Dfoo = "some string" SomeClass

14
adarshr

Java_TOOL_OPTIONS環境変数を使用してオプションを設定できる場合があります。 Rasbianでうまくいきました。 環境変数とシステムプロパティ を参照してください。

多くの環境では、必要なコマンドラインオプションを使用してアプリケーションを起動するために、コマンドラインに簡単にアクセスできません。

これは、組み込みVMを使用するアプリケーション(VMを起動するためにJava Native Interface(JNI)呼び出しAPIを使用することを意味する)または起動がスクリプトで深くネストされているアプリケーションでよく起こります。これらの環境では、Java_TOOL_OPTIONS環境変数はコマンドラインを拡張するのに役立ちます。

JNI_CreateJavaVM関数(JNI呼び出しAPI)でこの環境変数が設定されると、JNI_CreateJavaVM関数は環境変数の値をそのJavaVMInitArgs引数で提供されるオプションに追加します。

ただし、セキュリティ上の理由から、この環境変数の使用は無効になっている場合があります。

場合によっては、セキュリティ上の理由からこのオプションは無効になっています。たとえば、Oracle Solarisオペレーティングシステムでは、有効なユーザーまたはグループIDが実際のIDと異なる場合、このオプションは無効になります。

コマンドラインでの指定とJava_TOOL_OPTIONS環境変数の使用の違いを示すこの例を参照してください。

screenshot showing use of Java_TOOL_OPTIONS environment variable

4

必要なプロパティをシステムで設定する必要がある場合、-D以外のオプションはありませんが、アプリケーションのブートストラップ中にこれらのプロパティが必要な場合は、プロパティファイルを介してプロパティをロードするのが最適なオプションです。単一のプロパティのビルドを変更する必要はありません。

1
SUKHDEV PATIL