torutkのブログ

ソフトウェア・エンジニアのブログ

javafxpackagerコマンドでクラスパス指定なしにJavaFXアプリを実行するJARの生成

NetBeansJavaFXアプリケーションプロジェクトを用いて作成したプログラムのJARファイルは、JavaFX関連のクラスパスを指定せずとも実行可能でした。

これと同じことを、NetBeansではなくコマンドでコンパイルするときにどう実現するかを探ってみました。

JavaFX 2プログラムの作成

普通に作成します。JARファイル作成上、ソースファイルとクラスファイルは別なディレクトリに生成しておきます。

とりあえず、次のようなディレクトリを作成します。

 work
   +-- classes
   +-- src
         +-- torutk
               +-- HelloFx.java

HelloFxは、とりあえずボタンが1個の単純なもので作成。

package torutk;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.layout.BorderPane;
import javafx.scene.control.Button;
import javafx.scene.Scene;

public class HelloFx extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello JavaFX");
        BorderPane borderPane = new BorderPane();
        Button helloButton = new Button("HelloFx");
        borderPane.setCenter(helloButton);

        primaryStage.setScene(new Scene(borderPane, 320, 300));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

コンパイル

ここはふつうにjavacコマンドでコンパイルします。つまり、コンパイル時はJavaFX関連ライブラリへのクラスパス指定が必要です。

C:\work> javac -cp "C:\Program Files\Java\jdk1.7.0\jre\lib\jfxrt.jar";classes
 -sourcepath src src\torutk\HelloFx.java
C:\work> 

実行可能JARの作成

javafxpackagerコマンドでJavaFX実行可能JARファイルを作成します。javafxpackagerコマンドのドキュメント(英語)は次のURLです。

C:\work> javafxpackager -createjar
 -appclass torutk.HelloFx
 -srcdir classes
 -outdir dist -outfile HelloFx-0.1

C:\work> 

javafxpackagerコマンドは、JDK 7u6では[JDKインストールディレクトリ]\binの下(javac.exeなどと同じ)にあります。

  • createjar オプションは、コンパイル済みのクラスファイルなどから実行可能JARを生成します。
  • appclass オプションは、アプリケーションの主クラスをFQCNで指定します。
  • srcdir オプションは、コンパイルされたクラスファイルの格納場所(基底パス)を指定します。Javaのソースファイルの格納場所ではないので注意してください。
  • outdir オプションは、JARファイルを出力するディレクトリを指定します。
  • outfile オプションは、JARファイル名(拡張子.jarは省略可)を指定します。

この他にも、-preloader, -paramfile -argument -classpath, -manifestAttrs, -noembedlauncher, -noccs2bin, -runtimeversion, -srcfiles などのオプションがあります。詳しくはドキュメントを参照ください。

CSSファイルを含む場合(20121118追記)

JARの中にCSSファイルを含める場合、-nocss2binを追加指定する必要があります(この場合、CSSファイルはそのままテキスト形式でJARに含まれる)。

  • noccs2binを指定しない方法もありますが、未検証です(CSSファイルをバイナリ化してJARに含める模様)。

実行

生成されたJARファイルを、javaコマンドの-jarオプションで指定して実行する、Windows OSであればエクスプローラ上でjarファイルをダブルクリックする、という方法で実行できます。

メモ

javafxpackagerには、-makeallでソースから一気にJAR生成までするオプションもありますが、コンパイルエラー(デフォルトでは-source 1.5が適用されるらしく、Java SE 7の文法でエラー)になってしまいました。-source 7をどう指定するかが分からず放置。

ant-javafx.jarを使ってAntのビルドも可能ですが未確認。この方法を紹介している日本語のブログページを見つけましたのでURLを記します。

javafxpackagerには、MSI形式のインストーラなど各種OS固有のインストーラを作成する機能もあるようです。MSI形式の場合、別途Wixのインストールが必要なようです。

JavaFXは、単に新しいGUIライブラリというだけでなく、(デスクトップ)アプリケーションの作成・配布に新しい形態をもたらす要素技術がいろいろ含まれているのですね。先行き楽しみな技術です。