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
- Deploying JavaFX Applications 「10 JavaFX Ant Tasks」
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/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 を使ってなかったら動作はしますが・・・
- 作者: Steve Holzner,長瀬嘉秀(監訳),株式会社テクノロジックアート
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/11/18
- メディア: 大型本
- 購入: 2人 クリック: 20回
- この商品を含むブログ (18件) を見る
JavaFX 2.0: Introduction by Example
- 作者: Carl Dea
- 出版社/メーカー: Apress
- 発売日: 2011/12/07
- メディア: ペーパーバック
- クリック: 5回
- この商品を含むブログ (7件) を見る