Java Platform, Standard Editionデプロイメント・ガイド
目次      

10 JavaFX Antタスク

この章では、Antを使用してJavaFXアプリケーションをパッケージ化する方法を示します。

JavaFXアプリケーションをパッケージ化するための現在サポートされている方法は、JavaFX AntタスクおよびJavaFXパッケージャ・ツールのみです。これには、JavaFX Antタスクを使用してJavaFXアプリケーションをビルドするNetBeans IDEのサポートされているバージョンが含まれています。

このページのトピックは次のとおりです。

次の2つのAntタスク・リファレンスの項も参照してください。

10.1 JavaFX Antタスクを実行するための要件

これらのタスクを使用するには、ant-javafx.jarファイルが必要です。これは次の場所にあります。

  • JDK 7 Update 6以降では、jdk_home/libにあります。

  • スタンドアロンJavaFXインストールでは、javafx-sdk-home/libにあります。

10.3 JavaFX Antタスクの使用

AntスクリプトでJavaFX Antタスクを使用するには、その定義をロードする必要があります。例10-1のbuild.xmlファイルに例を示しています。

例10-1に関する注意は次のとおりです:

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に付属

10.4 Antスクリプトの例

このセクションでは、次のトピックについて説明します。

10.4.1 JavaFX Hello Worldの例のデプロイ

Antスクリプトを使用したJARファイルとしてJavaFX Hello Worldの例をデプロイするには、次の手順に従います。

  1. アプリケーションの例を格納するディレクトリを作成します。次の手順では、ディレクトリC:\exampleを使用します。

  2. 例10-2C:\example\src\HelloWorld.javaとして保存します。

  3. 例10-3C:\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>
    
  4. ファイルbuild.xmlで、JAVA_HOMEプロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。

    <property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
    
  5. コマンド行プロンプトで、ディレクトリをC:\exampleに変更します。JavaFX HelloWorldの例をコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。

    ant
    
  6. 例を実行するには、コマンド行プロンプトで、ディレクトリをC:\example\distに変更し、次のコマンドを実行します。

    java -jar HelloWorld.jar
    

10.4.3 外部JARファイルを使用したJavaFXアプリケーションのデプロイ

Ensemble8サンプル・アプリケーションには、Apache Luceneが必要です。次の手順では、自己完結型アプリケーションとしてEnsemble8サンプル・アプリケーションをデプロイし、それにApache Lucene JARファイルを含める方法を示します。

  1. 次のページから、ご使用のオペレーティング・システムのJDKデモおよびサンプルをダウンロードします。

    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    ダウンロードしたファイルを解凍します。Ensemble8のサンプルは、ディレクトリdemo/javafx_samples/src/Ensemble8に含まれています。

  2. ファイル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ファイル(libディレクトリに格納)が含まれています。

          <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>
    

  3. ファイルbuild.xmlで、JAVA_HOMEプロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。

    <property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
    
  4. コマンド行プロンプトで、ディレクトリをdemo/javafx_samples/src/Ensemble8に変更します。Ensemble8サンプル・アプリケーションをコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。

    ant
    
  5. Ensemble8サンプル・アプリケーションを実行するには、demo/javafx_samples/src/Ensemble8/bundles/Ensemble8に格納されているアプリケーションの1つを実行します。

10.4.4 自己完結型アプリケーションのJVMオプションのオーバーライド

自己完結型アプリケーションのJVMオプションをオーバーライドするには、設定ノードでそれを指定してから、app.preferences.idシステム・プロパティでこのノードの名前を設定します。次の例では、<fx:jvmuserarg>要素で指定された-Xmsおよび-Xmx JVMオプションをオーバーライドします。これらのオプションがオーバーライドされたことを確認するために、アプリケーションは、(-Xmsおよび-Xmxオプションの値に基づいて)メモリー割当てプールの初期サイズおよび最大サイズを表示します。JVMオプションの指定の詳細は、「ユーザーJVM引数の指定」を参照してください。

  1. アプリケーションの例を格納するディレクトリを作成します。次の手順では、ディレクトリC:\memexampleを使用します。

  2. 例10-5C:\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という名前の設定ノードを作成します。

  3. 例10-6C:\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);
        }
    }
    
  4. 例10-7C:\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>
    
  5. ファイルbuild.xmlで、JAVA_HOMEプロパティの値を変更することによって、コンピュータにインストールされるJDKの場所を指定します。強調表示されたテキストをJDKのフルパスに変更します。

    <property name="JAVA_HOME" value="C:\\Java\\jdk1.8.0"/>
    
  6. コマンド行プロンプトで、ディレクトリをC:\memexampleに変更します。この例をコンパイル、ビルドおよびデプロイするには、次のコマンドを実行します。

    ant
    
  7. メモリー・テスト・アプリケーションを実行するには、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オプションのカスタマイズ」を参照してください。

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.