ここでは、自己完結型JavaおよびJavaFXアプリケーションでJava Virtual Machine (JVM)の設定を変更するためのUserJvmOptionsService
APIについて説明します。次回アプリケーションを起動したときに、新しい設定が使用されます。
この節の内容は以下のとおりです。
JVMオプションは、JVMを構成するために使用されます。たとえば、メモリーを管理し、クラス・パスを設定し、デバッグをオンにするためにオプションを使用できます。Javaパッケージ化ツールを使用して自己完結型アプリケーションをパッケージする際、アプリケーションで使用するJVMオプション(-BjvmOptions
)を渡して、ユーザーが設定できるオプション(-BuserJvmOptions
)のデフォルト値を指定できます。
UserJvmOptionsService
APIにより、アプリケーションを介してJVMオプションを管理する方法を提供できます(プリファレンスを指定したり機能を設定するなど)。アプリケーションを起動するたびに、ユーザーが指定した設定が使用されます。設定を変更した場合、新しい設定を使用するにはアプリケーションを再起動する必要があります。
アプリケーションを起動すると、JVMオプションの値が次の順序で決定されます。
UserJvmOptionsService
APIで設定されたオプションが優先されます。
APIで設定されていないオプションの場合、アプリケーション・パッケージの作成時に指定された-BuserJvmOptions
引数の値が使用されます。
APIで設定されていないオプションまたは-BuserJvmOptions
引数の場合、アプリケーション・パッケージの作成時に指定された-BjvmOptions
引数の値が使用されます。
前述のいずれの場所でも指定されていないオプションについては、システム値が使用されます。
UserJvmOptionsService
APIは、java-home/lib
ディレクトリにあるpackager.jar
ファイルで使用できます。UserJvmOptionsService
APIを使用するには、自己完結型アプリケーションのバンドルにpackager.jar
ファイルを含めます。
UserJvmOptionsService
APIには、次のメソッドが含まれています。
getUserJVMDefaults
。詳細は、15.2.1項「UserJvmOptionsServiceのインスタンス化」を参照してください。
getUserJVMOptions
。詳細は、15.2.2項「JVMオプションの現在値の取得」を参照してください。
getUserJVMOptionDefaults
。詳細は、15.2.3項「JVMオプションのデフォルト値の取得」を参照してください。
setUserJVMOptions
。詳細は、15.2.4項「JVMオプションの新しい値の設定」を参照してください。
UserJvmOptionsService
APIの使用の最初の手順は、使用するサービスのインスタンスを取得することです。インスタンスは、パッケージャおよびランチャによって決定されます。正しいインスタンスを取得するには、次の例のようなコマンドでUserJvmOptionsService.getUserJVMDefaults()
を呼び出します。
UserJvmOptionsService ujo=UserJvmOptionsService.getUserJVMDefaults();
注意: UserJvmOptions のインスタンスを直接インスタンス化するのはやめてください。UserJvmOptions.getUserJVMDefaults() メソッドで提供されたもののみを使用してください。 |
アプリケーションの現在のJVMオプションを取得するには、getUserJVMOptions()
メソッドを使用します。このメソッドは、アプリケーション・パッケージの作成時にsetUserJVMOptions()
メソッドまたは-BuserJvmOptions
引数を使用して設定されたJVMオプションおよび値を返します。アプリケーションの起動後に設定に変更が加えられた場合、返される値はアプリケーション起動時に使用された設定ではなく、最新の設定です。
次の例は、15.2.1項「UserJvmOptionsServiceのインスタンス化」で取得したUserJvmOptionsService
のインスタンスを使用するgetUserJVMOptions()
メソッドへのサンプル・コールを示しています。
Map<String, String> userOptions = ujo.getUserJVMOptions();
JVMオプションはキーと値のペアとして返されます。各キーはダッシュ(-)で始まります。キーと値の間に等号記号(=)が必要な場合、キーは等号記号で終わらせます。
アプリケーションのデフォルトのJVMオプションを取得するには、getUserJVMOptionDefaults()
メソッドを使用します。このメソッドは、アプリケーション・パッケージの作成時に-BuserJvmOptions
引数を使用して設定されたJVMオプションおよび値を返します。
次の例は、15.2.1項「UserJvmOptionsServiceのインスタンス化」で取得したUserJvmOptionsService
のインスタンスを使用するgetUserJVMOptionDefaults()
メソッドへのサンプル・コールを示しています。
Map<String, String> defaults = ujo.getUserJVMOptionsDefaults();
JVMオプションはキーと値のペアとして返されます。各キーはダッシュ(-)で始まります。キーと値の間に等号記号(=)が必要な場合、キーは等号記号で終わらせます。
JVMオプションに加えられた変更を格納するには、setUserJVMOptions()
メソッドを使用します。新しい値を使用するには、アプリケーションを再起動する必要があります。アプリケーション・パッケージの作成時に-BuserJvmOptions
引数で指定されたオプションにユーザーが値を設定しなかった場合、アプリケーション起動時には-BuserJvmOptions
引数の値が使用されます。
JVMオプションはキーと値のペアとして渡されます。これらは、JVMに渡されるときに連結されます。キーはダッシュ(-)で始めます。キーと値の間に等号記号(=)が必要な場合、等号記号をキーの最後の文字にする必要があります。たとえば、システム・プロパティapplicationName
をSampleAppに設定するには、キー-DapplicationName=
および値SampleApp
を使用します。メモリー割当てプールの最大サイズを80メガバイトに設定するには、キー-Xmx
および値80M
を使用します。
次の例は、15.2.1項「UserJvmOptionsServiceのインスタンス化」で取得したUserJvmOptionsService
のインスタンスを使用するsetUserJVMOptions()メソッドへのサンプル・コール、およびuserOptions
変数に含まれるオプションのセットを示しています。
ujo.setUserJVMOptions(userOptions);
注意: 検証またはエラー・チェックは実行されません。無効な値が指定された場合、アプリケーションは起動しません。 |
次のサンプル・コードは、UserJvmOptionsService
APIを使用してアプリケーションが実行された最初および最後の時刻を追跡する方法を示しています。サンプルでは、オプションの現在値とデフォルト値を示す表も生成されています。
例15-1
// get the helper instance UserJvmOptionsService ujo = UserJvmOptionsService.getUserJVMDefaults(); Map<String, String> userOptions = ujo.getUserJVMOptions(); // print out all the options currently set for (Map.Entry <String, String> entry : userOptions.entrySet()) { System.out.println("key:" + entry.getKey() + " value:" + entry.getValue()); } // if we haven't marked the first run, do so now if (!userOptions.containsKey("-DfirstRunMs=")) { userOptions.put("-DfirstRunMs=", Long.toString(System.currentTimeMillis())); } // add the last run userOptions.put("-DlastRunMs=", Long.toString(System.currentTimeMillis())); // save the changes ujo.setUserJVMOptions(userOptions); ... // create a table row with Key, Current Value, and Default Value DefaultTableModel model = new DefaultTableModel(); model.addColumn("Key"); model.addColumn("Effective"); model.addColumn("Default"); Map<String, String> defaults = ujo.getUserJVMOptionDefaults(); for (Map.Entry <String, String> entry : userOptions.entrySet()) { // get the default, it may be null String def = defaults.get(entry.getKey()); model.addRow(new Object[] {entry.getKey(), entry.getValue(), def == null ? "<no default>" : def}); }