JDK 8u451では、JavaFXはJava SE 8の一部として含まれなくなりました。 詳細は、https://www.oracle.com/javase/javafxを参照してください。
ここでは、自己完結型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});
}