この章では、Antを使用してJavaFXアプリケーションをパッケージ化する方法を示します。
JavaFXアプリケーションをパッケージ化するための現在サポートされている方法は、JavaFX AntタスクおよびJavaFXパッケージャ・ツールのみです。これには、JavaFX Antタスクを使用してJavaFXアプリケーションをビルドするNetBeans IDEのサポートされているバージョンが含まれています。
このページのトピックは次のとおりです。
次の2つのAntタスク・リファレンスの項も参照してください。
これらのタスクを使用するには、ant-javafx.jarファイルが必要です。これは次の場所にあります。
JDK 7 Update 6以降では、jdk_home/libにあります。
スタンドアロンJavaFXインストールでは、javafx-sdk-home/libにあります。
JavaFXのAnt要素には2つのカテゴリがあります。次の各要素は、「JavaFX Antタスク・リファレンス」で説明されています。
JavaFX Antタスク
これらの要素は、次のタスクを実行します。
ダブルクリック可能なJARファイルの作成
Web StartアプリケーションまたはWebページに埋め込まれたアプリケーションのHTMLページおよびデプロイメント記述子の作成
アプリケーションへのデジタル署名(必要な場合)
CSSファイルのバイナリ形式への変換
自己完結型アプリケーション・パッケージの構築
「JavaFX Antタスク・リファレンス」を参照してください。JavaFXアプリケーションのパッケージ化に関する一般情報は、第5章「パッケージ化の基本」および第7章「自己完結型アプリケーションのパッケージ化」を参照してください。
Antヘルパー・パラメータ
これらの要素は、JavaFXタスクで使用されます。これらは、「JavaFX Antヘルパー・パラメータ・リファレンス」でリストおよび説明しています。
AntスクリプトでJavaFX Antタスクを使用するには、その定義をロードする必要があります。例10-1のbuild.xmlファイルに例を示しています。
例10-1 JavaFX Antタスク定義のロード
<project name="JavaFXSample" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant"> <target name="default"> <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath=".:path/to/sdk/lib/ant-javafx.jar"/> </target> </project>
例10-1に関する注意は次のとおりです:
一部のJavaFXタスクの短縮名が一部のシステム・タスクで使用される短縮名と同じであるため、例10-1に太字で示したfx: namespaceを宣言していることを確認します。
ドロップイン・リソースを使用してカスタマイズを簡略化するために、現在のディレクトリ(".")がクラスパスに追加されます。7.3.3項「ドロップイン・リソースを使用したパッケージのカスタマイズ」を参照してください。
JavaFX Antタスク定義がロードされると、javafx.ant.version
プロパティは、AntタスクAPIのバージョンの確認に使用できます。バージョン番号については次のリストを使用します。
バージョン1.0: JavaFX 2.0 SDKに付属
バージョン1.1: JavaFX 2.1 SDKに付属
バージョン1.2: JavaFX 2.2 SDKおよびJDK 7 Update 6に付属
このセクションでは、次のトピックについて説明します。
Antスクリプトを使用したJARファイルとしてJavaFX Hello Worldの例をデプロイするには、次の手順に従います。
アプリケーションの例を格納するディレクトリを作成します。次の手順では、ディレクトリC:\example
を使用します。
例10-2をC:\example\src\HelloWorld.java
として保存します。
例10-2 HelloWorld.java
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class HelloWorld extends Application { @Override public void start(Stage primaryStage) { Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
例10-3をC:\example\build.xml
として保存します。
例10-3 JavaFX Hello Worldの例をデプロイするAntスクリプト
<?xml version="1.0" encoding="UTF-8" ?> <project name="JavaFX Hello World Example" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant"> <property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/> <property name="build.src.dir" value="src"/> <property name="build.classes.dir" value="classes"/> <property name="build.dist.dir" value="dist"/> <target name="default" depends="clean,compile"> <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath="${JAVA_HOME}/lib/ant-javafx.jar"/> <fx:application id="HelloWorldID" name="JavaFXHelloWorldApp" mainClass="HelloWorld"/> <fx:resources id="appRes"> <fx:fileset dir="${build.dist.dir}" includes="HelloWorld.jar"/> </fx:resources> <fx:jar destfile="${build.dist.dir}/HelloWorld.jar"> <fx:application refid="HelloWorldID"/> <fx:resources refid="appRes"/> <fileset dir="${build.classes.dir}"/> </fx:jar> <fx:deploy width="300" height="250" outdir="." embedJNLP="true" outfile="helloworld"> <fx:application refId="HelloWorldID"/> <fx:resources refid="appRes"/> <fx:info title="JavaFX Hello World Application" vendor="Oracle Corporation"/> </fx:deploy> </target> <target name="clean"> <mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.dist.dir}"/> <delete> <fileset dir="${build.classes.dir}" includes="**/*"/> <fileset dir="${build.dist.dir}" includes="**/*"/> </delete> </target> <target name="compile" depends="clean"> <javac includeantruntime="false" srcdir="${build.src.dir}" destdir="${build.classes.dir}" fork="yes" executable="${JAVA_HOME}/bin/javac" source="1.8" debug="on"> </javac> </target> </project>
ファイルbuild.xml
で、JAVA_HOME
プロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。
<property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
コマンド行プロンプトで、ディレクトリをC:\example
に変更します。JavaFX HelloWorldの例をコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。
ant
例を実行するには、コマンド行プロンプトで、ディレクトリをC:\example\dist
に変更し、次のコマンドを実行します。
java -jar HelloWorld.jar
自己完結型アプリケーションとしてJavaFX Hello Worldの例をデプロイするには、要素<fx:deploy>
への属性nativeBundles="all"
を、build.xml
スクリプトに追加します。
<fx:deploy width="300" height="250" outdir="." embedJNLP="true" outfile="helloworld" nativeBundles="all">
前の項で説明されているように、JavaFX Hello Worldの例をコンパイル、ビルドおよびデプロイします。Antスクリプトでは、適用可能なすべての自己完結型アプリケーション・パッケージを作成し、ディレクトリC:\example\bundles\JavaFXHelloWorldApp
に格納します。(名前JavaFXHelloWorldApp
は、<fx:application>
要素のname
属性の値です。)たとえば、WindowsでJavaFX Hello Worldの例をデプロイする場合、Antスクリプトは、ファイル・ブラウザでダブルクリックすることで実行できる、C:\example\bundles\JavaFXHelloWorldApp\JavaFXHelloWorldApp.exe
という名前のアプリケーションを作成します。
Antスクリプトが自己完結型アプリケーションを作成する方法をカスタマイズできます。第7章「自己完結型アプリケーションのパッケージ化」を参照してください。
Ensemble8サンプル・アプリケーションには、Apache Luceneが必要です。次の手順では、自己完結型アプリケーションとしてEnsemble8サンプル・アプリケーションをデプロイし、それにApache Lucene JARファイルを含める方法を示します。
次のページから、ご使用のオペレーティング・システムのJDKデモおよびサンプルをダウンロードします。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
ダウンロードしたファイルを解凍します。Ensemble8のサンプルは、ディレクトリdemo/javafx_samples/src/Ensemble8
に含まれています。
ファイルdemo/javafx_samples/src/Ensemble8/build.xml
の内容を例10-4に置き換えます。
例10-4 Ensemble8サンプル・アプリケーションをデプロイするAntスクリプト
<?xml version="1.0" encoding="UTF-8" ?> <project name="Ensemble8 JavaFX Demo Application" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant"> <property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/> <path id="CLASSPATH"> <pathelement location="lib/lucene-core-3.2.0.jar"/> <pathelement location="lib/lucene-grouping-3.2.0.jar"/> <pathelement path="classes"/> </path> <property name="build.src.dir" value="src"/> <property name="build.classes.dir" value="classes"/> <property name="build.dist.dir" value="dist"/> <target name="default" depends="clean,compile"> <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath="${JAVA_HOME}/lib/ant-javafx.jar"/> <fx:application id="ensemble8" name="Ensemble8" mainClass="ensemble.EnsembleApp"/> <fx:resources id="appRes"> <fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/> <fx:fileset dir="lib"/> <fx:fileset dir="${build.classes.dir}"/> </fx:resources> <fx:jar destfile="${build.dist.dir}/ensemble8.jar"> <fx:application refid="ensemble8"/> <fx:resources refid="appRes"/> </fx:jar> <fx:deploy outdir="." embedJNLP="true" outfile="ensemble8" nativeBundles="all"> <fx:application refId="ensemble8"/> <fx:resources refid="appRes"/> <fx:info title="Ensemble8 JavaFX Demo Application" vendor="Oracle Corporation"/> </fx:deploy> </target> <target name="clean"> <mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.dist.dir}"/> <delete> <fileset dir="${build.classes.dir}" includes="**/*"/> <fileset dir="${build.dist.dir}" includes="**/*"/> </delete> </target> <target name="compile" depends="clean"> <javac includeantruntime="false" srcdir="${build.src.dir}" destdir="${build.classes.dir}" fork="yes" executable="${JAVA_HOME}/bin/javac" source="1.8" debug="on" classpathref="CLASSPATH"> </javac> <!-- Copy resources to build.classes.dir --> <copy todir="${build.classes.dir}"> <fileset dir="src/app/resources"/> <fileset dir="src/generated/resources"/> <fileset dir="src/samples/resources"/> </copy> </target> </project>
注意: Antスクリプトがサンプル・アプリケーションをコンパイルした後で、src ディレクトリに含まれるリソースが、コンパイルされたJavaクラス・ファイルを含むディレクトリにコピーされます。
<copy todir="${build.classes.dir}"> <fileset dir="src/app/resources"/> <fileset dir="src/generated/resources"/> <fileset dir="src/samples/resources"/> </copy> Antスクリプトの次の行には、Apache Lucerne JARファイル( <fx:resources id="appRes"> <fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/> <fx:fileset dir="lib"/> <fx:fileset dir="${build.classes.dir}"/> </fx:resources> <fx:jar destfile="${build.dist.dir}/ensemble8.jar"> <fx:application refid="ensemble8"/> <fx:resources refid="appRes"/> </fx:jar> |
ファイルbuild.xml
で、JAVA_HOME
プロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。
<property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
コマンド行プロンプトで、ディレクトリをdemo/javafx_samples/src/Ensemble8
に変更します。Ensemble8サンプル・アプリケーションをコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。
ant
Ensemble8サンプル・アプリケーションを実行するには、demo/javafx_samples/src/Ensemble8/bundles/Ensemble8
に格納されているアプリケーションの1つを実行します。
自己完結型アプリケーションのJVMオプションをオーバーライドするには、設定ノードでそれを指定してから、app.preferences.id
システム・プロパティでこのノードの名前を設定します。次の例では、<fx:jvmuserarg>
要素で指定された-Xms
および-Xmx JVMオプションをオーバーライドします。これらのオプションがオーバーライドされたことを確認するために、アプリケーションは、(-Xms
および-Xmx
オプションの値に基づいて)メモリー割当てプールの初期サイズおよび最大サイズを表示します。JVMオプションの指定の詳細は、「ユーザーJVM引数の指定」を参照してください。
アプリケーションの例を格納するディレクトリを作成します。次の手順では、ディレクトリC:\memexample
を使用します。
例10-5をC:\memexample\src\MemoryExamplePreferences.java
として保存します。
次の文では、オプション-Xms
および-Xmx
の値をコンピュータに格納するjava.util.prefs.Preferences
ノードを取り出します。
prefs = Preferences.userRoot().node(System.getProperty("app.preferences.id")).node("JVMUserOptions");
このノードの名前はapp.preferences.id/JVMUserOptions
です。app.preferences.id
プロパティの値は、<fx:application>
要素のid属性の値です。この例では、app.preferences.id
の値はMemoryTestAppID
です。自己完結型アプリケーションを実行すると、起動ツール・プログラムはシステム・プロパティを自動的に設定します。ただし、クラスを直接実行する場合、システム・プロパティとしてapp.preferences.id
の値を指定する必要があります。たとえば、コマンド行からこのクラスを実行する場合、app.preferences.id
の値を次のように指定します。
java -cp classes -Dapp.preferences.id=MemoryTestAppID
この例では、Antビルド・スクリプトはMemoryTestPreferences
クラスを実行し、app.preferences.id
プロパティの値を設定します。
たとえば、Microsoft Windowsを使用している場合、このクラスは、WindowsレジストリにComputer\HKEY_CURRENT_USER\Software\JavaSoft\Prefs\MemoryTestAppID\JVMUserOptions
という名前の設定ノードを作成します。
例10-5 MemoryExamplePreferences.java
import java.util.prefs.Preferences; public class MemoryTestPreferences { private Preferences prefs; public void setPreferences() { // This will define a node in which the preferences can be stored prefs = Preferences.userRoot().node(System.getProperty("app.preferences.id")).node("JVMUserOptions"); // now set the values prefs.put("-Xmx", "2048m"); prefs.put("-Xms", "2048m"); } public static void main(String[] args) { MemoryTestPreferences myPrefs = new MemoryTestPreferences(); myPrefs.setPreferences(); } }
例10-6をC:\memexample\src\MemoryExample.java
として保存します。
例10-6 MemoryExample.java
import javafx.application.Application; import javafx.collections.FXCollections; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TextField; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.stage.Stage; import java.lang.management.ManagementFactory; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; public class MemoryTest extends Application { @Override public void start(Stage primaryStage) { String startMemory = Long.toString(Runtime.getRuntime().totalMemory()); String maxMemory = Long.toString(Runtime.getRuntime().maxMemory()); System.out.println("Start memory: " + startMemory); System.out.println("Max memory: " + maxMemory); final Label startMemoryLabel = new Label("Start memory: "); TextField startMemoryTextField = new TextField(startMemory); startMemoryTextField.setPromptText(startMemory); Label maxMemoryLabel = new Label("Max memory: "); final TextField maxMemoryTextField = new TextField(maxMemory); maxMemoryTextField.setPromptText(maxMemory); Label jvmArgumentsLabel = new Label("JVM Arguments"); ListView<String> jvmArguments = new ListView<>(FXCollections.observableArrayList(ManagementFactory.getRuntimeMXBean().getInputArguments())); jvmArguments.setPrefSize(450, 150); Button btn = new Button(); btn.setText("Update Preferences"); btn.setOnAction(event -> { Preferences prefs = Preferences.userRoot().node(System.getProperty("app.preferences.id")).node("JVMUserOptions"); String start = startMemoryTextField.getText(); if (start == null || start.isEmpty()) { prefs.remove("-Xms"); } else { prefs.put("-Xms", start); } String max = maxMemoryTextField.getText(); if (max == null || max.isEmpty()) { prefs.remove("-Xmx"); } else { prefs.put("-Xmx", max); } try { prefs.flush(); } catch (BackingStoreException e) { e.printStackTrace(); } }); GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(25, 25, 25, 25)); grid.getColumnConstraints().setAll( new ColumnConstraints(Region.USE_PREF_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_PREF_SIZE, Priority.NEVER, HPos.RIGHT, false), new ColumnConstraints(Region.USE_PREF_SIZE, Region.USE_COMPUTED_SIZE, Integer.MAX_VALUE, Priority.ALWAYS, HPos.LEFT, true) ); grid.addRow(0, startMemoryLabel, startMemoryTextField); grid.addRow(1, maxMemoryLabel, maxMemoryTextField); grid.addRow(2, jvmArgumentsLabel, jvmArguments); grid.add(btn, 1, 3); grid.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); Scene scene = new Scene(grid); primaryStage.setTitle("Memory test"); primaryStage.sizeToScene(); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
例10-7をC:\memexample\build.xml
として保存します。
このAntスクリプトは、MemoryTestPreferencesクラスをコンパイルおよび実行し、app.preferences.id
プロパティの値を設定します。
<java fork="true" jvm="${env.JAVA_HOME}\bin\java" classname="MemoryTestPreferences" classpath="${build.classes.dir}"> <sysproperty key="app.preferences.id" value="MemoryTestAppID"/> </java>
例10-7 メモリー・テスト用のAntスクリプトの例
<?xml version="1.0" encoding="UTF-8" ?> <project name="JavaFX Hello World Example" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant"> <property environment="env"/> <property name="env.JAVA_HOME" value="C:\\Java\\jdk1.8.0"/> <property name="build.src.dir" value="src"/> <property name="build.classes.dir" value="classes"/> <property name="build.dist.dir" value="dist"/> <target name="default" depends="clean,compile"> <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath="${env.JAVA_HOME}/lib/ant-javafx.jar"/> <fx:application id="MemoryTestAppID" name="JavaFXMemoryTestApp" mainClass="MemoryTest"/> <fx:resources id="appRes"> <fx:fileset dir="${build.dist.dir}" includes="MemoryTest.jar"/> </fx:resources> <fx:jar destfile="${build.dist.dir}/MemoryTest.jar"> <fx:application refid="MemoryTestAppID"/> <fx:resources refid="appRes"/> <fileset dir="${build.classes.dir}"/> </fx:jar> <fx:deploy width="300" height="250" outdir="." embedJNLP="true" outfile="memorytest" nativeBundles="image"> <fx:platform> <fx:jvmuserarg name="-Xms" value="31m"/> <fx:jvmuserarg name="-Xmx" value="64m"/> </fx:platform> <fx:application refId="MemoryTestAppID"/> <fx:resources refid="appRes"/> <fx:info title="JavaFX Hello World Application" vendor="Oracle Corporation"/> </fx:deploy> </target> <target name="clean"> <mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.dist.dir}"/> <delete> <fileset dir="${build.classes.dir}" includes="**/*"/> <fileset dir="${build.dist.dir}" includes="**/*"/> </delete> </target> <target name="compile" depends="clean"> <javac includeantruntime="false" srcdir="${build.src.dir}" destdir="${build.classes.dir}" fork="yes" executable="${env.JAVA_HOME}/bin/javac" source="1.8" debug="on"> </javac> <!-- Set preferences --> <java fork="true" jvm="${env.JAVA_HOME}\bin\java" classname="MemoryTestPreferences" classpath="${build.classes.dir}"> <sysproperty key="app.preferences.id" value="MemoryTestAppID"/> </java> </target> <target name="jar" depends="compile"> <jar destfile="dist/MemoryTest.jar" basedir="classes"/> </target> </project>
ファイルbuild.xml
で、JAVA_HOME
プロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。
<property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
コマンド行プロンプトで、ディレクトリをC:\memexample
に変更します。この例をコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。
ant
メモリー・テスト・アプリケーションを実行するには、C:\memexample\bundles\bundles/JavaFXMemoryTestApp
に格納されているアプリケーションの1つを実行します。
メモリー割当てプールの初期サイズおよび最大サイズに加えて、この例では、使用しているJVM引数を表示します。
-Djava.library.path=C:\memexample\bundles\JavaFXMemoryTestApp\app\ -Dapp.preferences.id=MemoryTestAppID -Xms2048m -Xmx2048m
Antビルド・スクリプトは、<fx:jvmuserarg>要素を使用して、メモリー割当てプールの初期サイズと最大サイズをそれぞれ31mと64mに指定します。ただし、この例のAntスクリプトは、アプリケーションの実行前に、Preferences
ノードに2048mと2048mの優先的な値を格納する別のプログラムを実行するため、それらの値がかわりに使用されます。
UserJvmOptionsService
APIは、自己完結型アプリケーションにJVMオプションを設定するための代替方法を提供します。このAPIをアプリケーションから呼び出して、現在の設定を取得し、次回のアプリケーション起動時に設定を更新できます。詳細は、第15章「自己完結型アプリケーションでのJVMオプションのカスタマイズ」を参照してください。