[JavaFX] Native packaging for JavaFX

原文はこちら。
https://blogs.oracle.com/talkingjavadeployment/entry/native_packaging_for_javafx

JavaFX 2.2にはJavaFXアプリケーション用の新しいパッケージングオプションが追加されています。これによりネイティブ形式としてアプリケーションをパッケージングできます。この方法を使えば、外部依存(JREやJavaFX SDKなど)は関係なくアプリケーションをインストールし、実行できます。このエントリでは概要とこの機能が導入された背景、そして入門編をご紹介します。

スクリーンショットからユーザーエクスペリエンスのアイデアが浮かぶかもしれませんが、まずは最初の実体験が肝心です。詳細の説明に入る前に、exe、msi、dmg、rpmインストーラーとrpmが使えないLinuxバンドルのzipといった、Ensemble間の微妙な違いを示しておきます。代わりに、JFxtras 2のネイティブパッケージをチェックしてみましょう。
Ensemble
exe形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/win/Ensemble2-1.0.exe
msi形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/win/Ensemble2.msi
dmg形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/mac/Ensemble2.dmg
rpm形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/linux/Ensemble2-1.0-1.i686.rpm
Zip形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/linux/Ensemble2.zip

JFXtras 2
http://jfxtras.org/


今までのデプロイメントオプションに何か問題でも?
JavaFX 2アプリケーションは、スタンドアプリケーションとして配布したり、Webにデプロイされたアプリケーション(Webページへの埋め込みもしくはWebページからアプリケーションを起動するリンクとして)として簡単に配布できます。JavaFXパッケージングツールはantタスクやjavafxpackagerユーティリティのようなものですが、これを使うとデプロイメントパッケージの作成がずっと簡単です。なぜ新たなデプロイ方法を追加したのでしょうか。
JavaFXパッケージングツール
http://docs.oracle.com/javafx/2/deployment/deploy_overview.htm#BABCGDJF
JavaFXアプリケーションには暗黙のうちにJavaやJavaFXランタイムへの依存性があり、既存のデプロイ方法がシステム要件に合うことを検証する手段を提供し、ユーザにインストールやアップグレードが必要であることをガイドするのに対し、このパッケージング方法では重要なシナリオの全てに対応しているわけではありません。特に、こんな例です。
  • 新しいシステムソフトウェアをインストールするための管理者権限を、そのユーザが持っていない場合。
  • アプリケーションが特定の環境 (Java、JavaFXのバージョン固定)での実行が保証されている場合に、 (環境をセキュアにするため)JavaやJavaFXのシステムバージョンの自動アップデートにより、 ユーザがこの環境を保持することが困難な場合がある。場合によっては、他のアプリが異なるJREやJavaFXの要件を持っており、対象となるアプリと相容れない可能性がある。
  • 配布チャネルが外部フレームワークへの依存を許可しない場合(例えばMacのAppStore)
JavaFXアプリケーション向けの"native package"って何者?
手短に言うと、こんな感じです。
  • JavaFXアプリケーションをプラットフォーム固有のアプリケーションバンドルにまとめるためのラッパー
  • 各バンドルは自己完結しており、以下のものを含む。
    • アプリケーションコードとリソース(スタンドアロンアプリケーションをjarから起動する際に必要なものと同じ)
    • JavaとJavaFXランタイム(このアプリケーションでの利用に限定したプライベートコピー)
    • ネイティブアプリケーションランチャ
    • メタデータ(アイコンなど)
  • JavaやJavaFXランタイムの個別インストールは不要
  • zipファイルやプラットフォーム固有のインストーラとしてパッケージされているもの
  • アプリケーションの変更はなく、同じjarのアプリケーションバイナリをネイティブバンドル、ダブルクリック可能なjar、web startアプリとしてデプロイできる。
長所
  • 新しいシステムへの アプリケーションインストールが簡単。zipもしくはユーザレベルのインストーラを使用する場合、管理者権限は不要。
  • 互換性を考慮する必要がない場合。アプリケーションは、JavaとJavaFXのプライベートコピーを使っており、開発者が、更新タイミングをコントロールする。
  • MacのAppStore(またはWindows、その他)用にアプリケーションを簡単にパッケージングする。
  • 実行するアプリケーションのプロセス名を (単にjava.exeではなく) アプリケーションにちなんで命名する。
  • エンタープライズデプロイメントツールを使って簡単にアプリケーションをデプロイする(例えばMSIとしてデプロイ)
  • サポートはJDK 7u6に組み込み(JavaFX 2.2を含む)
このデプロイ方法を追加した結果、他のデプロイ方法が廃止になるのでしょうか。いいえ、JavaFXがサポートする他のデプロイ方法を廃止する予定はありません。各方法は異なる要件に対応しているからです。どのネイティブパッケージング方法がjavaFXアプリケーションにとって最適かを決定するのは、要件次第です。
考慮すべき注意事項をいくつか。
  • 「ダウンロードして実行」というユーザーエクスペリエンス
    Webデプロイメントとは異なり、ユーザエクスペリエンスは「Webからアプリを起動」するものとは異なり、「ダウンロード、インストール、実行」プロセスなので、ユーザはアプリケーションを起動するために追加の手順が必要になることがあります。例えばブラウザセキュリティダイアログを許可したり、アプリケーションインストーラを「ダウンロード」フォルダから見つけ、実行するといったことがらです。
  • ダウンロードサイズが大きい
    一般に、バンドルされたアプリケーションのサイズはバンドルされていないアプリケーションよりも著しく大きくなりますが、これはJREやJavaFXのプライベートコピーが含まれているからです。圧縮やカスタマイズ可能なトリミングなどでサイズを小さくしようとしていますが、常にシステム上のJREに依存するアプリケーションに比べて十分大きなサイズになります。
  • ターゲットプラットフォーム毎のバンドル
    バンドルフォーマットはプラットフォーム固有です。現在はネイティブバンドルをアプリケーションを作成している同一システム向けにのみ作成できます。これはつまり、Windows、Linux、Macのネイティブバンドルを提供したい場合、各3プラットフォームでビルドしなければなりません。
  • アプリケーションのアップデートは開発者の責務
    WebデプロイされたJavaアプリケーションは、 利用可能になった時点で速やかに、更新版をWebから自動的にダウンロードします。Java Autoupdateメカニズムは年に数回最新のセキュアなバージョンにJavaとJavaFXランタイムをアップグレードします。バンドルされたアプリケーションではこの機構のサポートは含まれていません。3rdパーティのライブラリ(例えばMacにおけるSparkle)を使い、アプリケーションレベルで自動更新のサポートを追加することが可能です。 JavaFXの将来のバージョンでは自動更新のビルトインサポートを組み込む予定です。 (ご興味あるようなら、RT-22211を追跡されることをお勧めします)
    Add ability to automatically update co-bundled app
    http://javafx-jira.kenai.com/browse/RT-22211
ネイティブバンドルを始めてみよう
まず、最新のJDK 7u6ベータビルド(build 14以後を推奨)を入手する必要があります。
Java™ Platform, Standard Edition 7 Update 6 Developer Preview Releases
http://jdk7.java.net/download.html
Windows/Mac/LinuxではJavaFX 2.2 SDKがJDKインストーラに付属しており、この中にJavaFXパッケージングツールが含まれています。
  • bin/javafxpackager
    JavaFXパッケージ生成のコマンドラインユーティリティ
  • lib/ant-javafx.jar
    JavaFXパッケージを生成するためのantタスクのセット(アプリケーションデプロイにおいて最も推奨される方法)
利用方法に関する一般的な情報は、Deploying JavaFX Application Guideを参照して下さい。
Deploying JavaFX Applications
http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm
このツールを使って、他のデプロイメント用にJavaFXアプリケーションをパッケージする方法を知っていれば、ちょっとした微調整だけでネイティブバンドルを生成できます。
  • インストール済みのJDK7u6バンドルからのJavaを使っていることを確認する
    • 必要であれば、PATHの設定を調整する
  • antタスクを使っているのであれば、
    • fx:deployタスクにnativeBundles=all属性を追加
  • javafxpackagerを使っている場合
    • -nativeオプションをデプロイコマンドに渡す
    • もしくは、makeallコマンドを使っているなら、デフォルトでネイティブパッケージを作成しようとする
  • 生成されたバンドルは他のデプロイメントアーティファクトと並んでbundleフォルダに格納されている
注意頂きたいのは、ネイティブパッケージ(exeやmsiなど)の種類により、3rdパーティ製ソフトウェアのインストールが必要になったり、PATHに通す必要があります。
JDK7u6 build 14の段階では、以下のパッケージタイプを利用できます。
  • Windows:
    • バンドルイメージ
    • EXE:
      • Inno Setup 5以後が必要
        Inno Setup
        http://www.jrsoftware.org/isdl.php
      • 生成されたexeはユーザレベルインストーラとして機能する(インストールに管理者権限は不要)
      • 少なくとも一つのショートカットがメニューもしくはデスクトップに作成される
      • アプリケーションはインストール終了時に起動される
    • MSI:
      • WiX(Windows Installer XML) 3.0以後が必要。
        Windows Installer XML (WiX) toolset
        http://wix.sourceforge.net/
      • 生成されたMSIはユーザレベルインストーラとして機能する(インストールに管理者権限は不要)
      • 少なくとも一つのショートカットがメニューもしくはデスクトップに作成される
  • MacOS:
    • バンドルイメージ
    • dmg (ドラッグ&ドロップ)インストーラ
  • Linux:
    • バンドルイメージ
    • rpm
      • rpmbuildが必要
      • プログラムメニューにショートカットを追加
NetBeansを使ってデプロイメントパッケージを作っているのであれば、カスタムビルドステップをbuild.xmlに追加して、ネイティブバンドルが有効になるようfx:deployタスクを実行する必要があります。以下はBrickBreakerというサンプルのbuild.xmlの一部です。
<target name="-post-jfx-deploy">
    <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
               nativeBundles="all"
               outdir="${basedir}/${dist.dir}" outfile="${application.title}">
        <fx:application name="${application.title}" mainClass="${javafx.main.class}">
             <fx:resources>
                 <fx:fileset dir="${basedir}/${dist.dir}" includes="BrickBreaker.jar"/>
             </fx:resources>
             <info title="${application.title}" vendor="${application.vendor}"/>
        </fx:application>
    </fx:deploy>          
</target>
これはfx:deployタスクのきわめて一般的な使い方ですが、ここでの唯一の特記部分はnativeBundles="all"です。ネイティブ版取りの作成を試す上でおそらく一番簡単な方法は最新のJavaFXのサンプルバンドルをダウンロードして、Ensemble、BrickBreakerもしくはSwingInteropをビルドすることでしょう。
JavaFX and Scene Builder Developer Preview Download
http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html
是非試して頂き、あなたの体験を伝えて下さい。あなたからのフィードバックが大切なのです。
ところで、バグ登録やJavaFXバグデータベースへの追加機能リクエストもよろしくお願いします。
JavaFX bug database
http://javafx-jira.kenai.com/

待って!ではどうしたらいいの?
このエントリはネイティブバンドルへの包括的なガイドではないので、このトピックについてエントリを投稿する予定ですが、ネイティブバンドルを使ってみるとたくさんの質問事項が出てくるはずです。全ての質問にはお答えできませんが、是非質問をお寄せ下さい。あらゆる質問を知ることが回答を見つける最初のステップですのでね。

0 件のコメント:

コメントを投稿