JDK 8u451では、JavaFXはJava SE 8の一部として含まれなくなりました。 詳細は、https://www.oracle.com/javase/javafxを参照してください。
この章では、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オプションのカスタマイズ」を参照してください。