004 Java Web StartでJava VMが2回起動する?
こんにちは!id:EC-OneのAkiです。
今回はナレッジセンターで対応した質問の一つ、「Java Web Startアプリケーションの起動高速化の為に、Java VMの起動回数を減らしたい」というお話をしたいと思います。
Java Web Start採用理由とその起動シーケンス
Webブラウザではなかなか実現が難しいリッチなユーザインタフェース。
それを実現するための手段にはいくつかあると思うのですが、とあるプロジェクトでは経理伝票入力等の画面を、リッチかつ動作も軽快に実現するためにSwingを選択しました。
(EC-OneではこれまでもSwingを選択した事が何度かあります)
このシステムが出来上がった後、お客様の担当者の方が社内向けにデモをされる場に同席させて頂いたのですが、まぁかなり凝りまくった画面でした。見ていた方から「○○さん(担当者の方)のやりたい事、全部やったって感じですか? (^ ^)」との声が出るぐらい。
そのSwingアプリケーションを配布&起動する仕組みとしては、Java Web Startを採用しています。
これにより、ユーザはWebブラウザで「アプリケーション起動リンク」をクリックするだけでアプリケーションのダウンロードとインストールと起動が行えるのです。一度ダウンロード&インストールされたアプリケーションはJava Web Startがキャッシュするため、次回からの起動は早くなります。
起動シーケンスは、簡単にいうと以下のようになります。
- WebブラウザでJNLPという拡張子のファイルをダウンロード
- 当該ファイルに関連付けられているJava Web Startが起動
- JNLPファイル内には以下が書かれている
- 必要なjarファイルのURL
- main()を持つクラスの名前
- 起動引数
- Java Web Startは、必要なjarファイルをダウンロードしてキャッシュし、main()を起動する
- 初期画面を表示する
起動時間の短縮のために行った3つのこと
上記の起動シーケンスをなるべく短時間で終えるため、このプロジェクトでは以下を行いました。
- アプリケーションの初期化処理をマルチスレッドでパラレルに行う
- 希望するユーザには「jarの事前インストールCD」を配布する
- なるべく短時間でJava Web Startが処理を終えるようにJNLPを書く
Java Web Startでは最初に起動したJava VMの中から対象アプリケーションのmain()を起動するのですが、色々試すうちに「もう一回Java VMを起動しなおす」場合があることがわかりました。
その原因は以下の通りです。
- JNLP内でJava VMの情報を指定するのに<java>を使用している。
- JNLP内でのJava VMのバージョンの指定がインストールされている最新のJREより古い。
- 例えば、バージョンに1.6.0_11を指定していて、1.6.0_11と1.6.0_12を両方インストールしている場合。
(一旦1.6.0_12でJava Web Startが起動し、その後1.6.0_11で起動し直す為)
- 例えば、バージョンに1.6.0_11を指定していて、1.6.0_11と1.6.0_12を両方インストールしている場合。
- JNLP内でVMの引数に「swing.noxp」というシステムプロパティを指定している。
- <property>で指定しても-Dで指定してもやはり2回のまま。
- JNLPからこの指定を削除し、main()の1行目でsetProperty()して解決。
Java Web Startを使用されている方はあまり多くはないかもしれませんが、それらの方々の参考になれば、と思い、上記のようなことを書いてみました。(ナレッジセンターにはニッチな質問がくることが多い、と以前のエントリ*1で少し書きましたが、実際こんな感じなんです)
今回ご紹介した質問のように「あまり一般的な技術ではないんだけど...」と思われることでも、ご相談頂ければEC-Oneのナレッジセンターは親身になって対応いたします。お気軽にご相談ください!
関連エントリ
Java、Ruby及び周辺のOSSを用いた開発に関して、企業があらゆる悩みごとを相談できるのが、ナレッジセンターの「レスキューサービス」です。
どんな相談でも親身に受け付けますので、レスキューサービスってなに?もっと知りたい!と思った方はお気軽に問い合わせ下さい。