倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

JavaFX プロジェクトの実行可能 Jar ファイルを作成する with Apache Ant

JavaFX 2.0 が javac コマンドでコンパイルできるようになったので、適当なマニフェストファイルと合わせて Jar に詰め込んだら実行可能 Jar ファイル(ダブルクリックで実行できる Jar ファイル*1)が作れるのかと思ったら、そうアマくはありませんでした。 ってことで、今回は JavaFX プロジェクトの実行可能 Jar を作成する方法を見ていきます。

JavaFX 2.0 の SDK には、このパッケージングを行う専用ツールが2種類同伴されています*2

  • 実行ファイル javafxpackager.exe (JAVAFX_HOME/bin フォルダ) : Windows の場合
  • Ant タスク ant-javafx.jar (JAVAFX_HOME/tools フォルダ)

ここでは Ant タスクを使ってパッケージングを行う方法を見ていきます。 Apache Ant はインストール済みって前提で*3

参考 URL

JavaFX プロジェクトをパッケージングする build.xml


Ant タスクには電子署名や WebStart/Applet の Web ページ作成などのタスクも内蔵されているそうですが、ここでは最小限のパッケージングのみを行います。 

JavaFX のインストール・フォルダへのパスを環境変数 JAVAFX_HOME に設定しておいてください。 で、以下のような内容の build.xml ファイルを作成します:

<project name="JavaFXProject" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">

    <property environment="env" />
    <property name="javafx.tools.ant.jar" value="${env.JAVAFX_HOME}/tools/ant-javafx.jar" />

    <!-- Gradle 風のフォルダ構造なら・・・ -->
    <!--property name="src" location="src/main/java" /-->
    <property name="dest" location="build/classes/main" />
    <property name="jardest" location="build/libs" />    <!-- 実行可能 Jar ファイルが作成されるフォルダ -->
    
    <!-- アプリケーションの設定 -->
    <property name="app.vendor" value="org.waman" />
    <property name="app.id" value="colorful-circles" />    <!-- 実行可能 Jar ファイルの名前(の一部) -->
    <property name="app.name" value="ColorfulCircles" />
    <property name="app.version" value="1.0" />
    <property name="app.main-class" value="org.sample.Main" />    <!-- メインクラス -->

    <!-- タスク定義 -->
    <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
                 uri="javafx:com.sun.javafx.tools.ant"
                 classpath="${javafx.tools.ant.jar}"/>
 
    <fx:application id="app-info"
                          name="${app.name}"
                          mainClass="${app.main-class}" />
    
    <fx:jar destfile="${jardest}/${app.id}-${app.version}.jar">
        <fx:application refid="app-info"/>
        <manifest>
            <attribute name="Implementation-Vendor" value="${app.vendor}"/>
            <attribute name="Implementation-Title" value="${app.name}"/>
            <attribute name="Implementation-Version" value="${app.version}"/>
        </manifest>
        <fileset dir="${dest}"/>
    </fx:jar>
</project>

ここではプロジェクトのフォルダ構造を Gradle 風にしています。 つまり、プロジェクトのルートフォルダを PROJECT_HOME として

  • PROJECT_HOME
    • build.xml
    • src
      • main
        • java : ソースフォルダのルート
    • build
      • classes
        • main : クラスファイルを配置するフォルダのルート
      • libs : 実行可能 Jar ファイルを配置するフォルダ

となっているとしています。 ただし、このビルドファイルではソースコードが既にコンパイルされて、クラスファイルが PROJECT_HOME/build/classes に配置されている前提でパッケージングを行います。 ソースのコンパイルについては後述。 これらのフォルダ構造やアプリケーションの設定を変えたいなら、対応する property 要素の location 属性や value 属性を変更してください。 どれがどれかは説明なくても分かるかと・・・

上記の設定をして PROJECT_HOME 上でコマンド

ant

を実行すると、

  • PROJECT_HOME/build/libs/colorful-circles-1.0.jar

という実行可能 Jar ファイルが生成されます。 めでたしめでたし。

JavaFX プロジェクトのコンパイル


上記の build.xml は、Java ソースファイルがコンパイルされてクラスファイルが生成された後に実行しないと実行可能 Jar ファイルが生成されません。 JavaFX 2.0 からはソースのコンパイルは通常の javac でできるようになったので、JavaFX の Jar ファイルをクラスパス上に置いておきさえすれば普通にコンパイルできます。 プロジェクトが Gradle 風のフォルダ構造なら、下記のようなビルドファイルでコンパイルを実行できます:

<project name="JavaFXProject" basedir="." default="compile">

    <property environment="env" />
    <property name="src" location="src/main/java" />
    <property name="dest" location="build/classes/main" />

    <target name="clean">
        <delete dir="build" />
    </target>
    
    <target name="compile" depends="clean">
        <mkdir dir="${dest}" />
        <javac srcdir="${src}" destdir="${dest}" classpath="${env.JAVAFX_HOME}/rt/lib/jfxrt.jar" />
    </target>
</project>

ただし、ここに定義されている target を前節のパッケージングを行う build.xml にそのまま書くと、何故か compile ターゲットが上手く動きませんでした。 clean ターゲットはキチンと動くので修正可能だと思いますが挫折・・・ とりあえず、今回はこのくらいでご勘弁を(笑)

追記


Gradle のフォルダ構造では、main のソースをコンパイルして生成されるクラスファイルは

  • PROJECT_HOME/build/classes/main

フォルダに配置されますが、当初 main フォルダを入れてなかったので修正しました。 Gradle を使ってなかったら動作はしますが・・・

Ant 第2版

Ant 第2版


JavaFX 2.0: Introduction by Example

JavaFX 2.0: Introduction by Example

*1:通常の Java アプリケーションでは、マニフェストファイルで、実行の起点となるクラスの完全修飾名を Main-Class プロパティに指定すれば、実行可能 Jar ファイルが作れます。

*2:JavaFX 2.0 の SDK をインストールしたフォルダを JAVAFX_HOME としています。

*3:Ant のバージョンは 1.8.0 で試しました。