3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Java)Java Web Startを使ってみた

Java Web Start ってのはブラウザから JAVA プログラムを起動する仕組みのことみたいです。

Javaプログラム本体もサーバから自動ダウンロードされ、最新版のチェックとかも勝手にやってくれるようですね。

旧来のファットクライアント方式は、配備が非常に面倒でしたが、それを解決できるリッチクライアントの一つとされているようです。

(ここら辺の歴史は、@IT:リッチクライアント”に至るまでの軌跡と現在(いま)がわかりやすいです。)

Java Web Start自体は JRE の中に含まれているので、クライアントは JRE さえ入っていれば問題ないようです。

ちょうど .NetClickOnce に近いものですね。。

さて、今回この Java Web Start のサーバ環境の構築をやってみました。

サーバは CentOS 5.3です。(RedHat系のディストリビューションの確認は /etc/redhat-release ファイルを見ればわかります)

■Sun製Javaのインストール

(Linux)Java Web Start補足1[Sun製Javaのインストール。]を参照してください。

■WEBサーバの設定

ここからが本題です。

Java Web Start(以下JWS)は JNLP というファイルから起動をかけるようです。

このため、Webサーバ(Apache)に JNLPMIME タイプを登録します。

>

httpd.conf に下記を追加。

AddType application/x-java-jnlp-file JNLP

JNLPファイルの作成

これが、起動する jar ファイルやクラス、ライブラリを指定するファイルですね。

実体は XML です。

JNLPの構文は、Sun:JNLP ファイルの構文でわかります。

今回は Sun のサンプルをベースに下記のように書いて見ました。

ファイル名は hello.jnlp

 version="1.0" encoding="utf-8"?>

spec="6.0+"

codebase="http://xxx.xxx.com/jws/"

href="hello.jnlp">

>

>Java Web Start Sample>

>3流PG, Inc.>

/>

online="false">

/>

submenu="Java Web Start Sample Apps"/>

>

>

>-->

>

/>

>

>

version="1.6+" java-vm-args="-esa -Xnoclassgc"/>

href="jws_sample.jar"/>

href="lib/libname.jar"/>

>

main-class="test"/>

>

重要なのは、codebase でパス指定、security、jar href= で動かしたいJARやライブラリ用JAR指定、application-desc main-class= でメインメソッドのクラス指定くらいだと思います。

■JARの作成

Java アプリケーションを JAR で出力します。

今回は Swing アプリケーションで、ただ単にラベルを張り付けただけにしました。

IDE は Eclipse を使ったので、GUIデザイナツールとして、Visual Swing for Eclipseを使いました。(詳細は【コラム】イマドキのIDE事情 (60) Swing用Eclipseプラグインの決定版! Visual Swing for Eclipse | エンタープライズ | マイコミジャーナル)

で、実行可能なJARファイルとして出力します。(最初ただの JAR で出力してると Visual Swing for Eclipse のライブラリが含まれておらず、NoClassDefFoundError,ClassNotFoundException が発生したの凡ミス注意です)

■JARに署名がいる

上記で作成したJARですが、デジタル署名が必要なようです。

デジタル署名していないと、下記のようなエラーとなります。

ということで、テストのため自前のオレオレ証明書を作成します。(正規に運用するんだったら、認証局から発行された証明書使わないといけませんけどね。)

まず、証明書を作らないといけないので、JDK付属の keytool を使って作成します。(keytool の使い方は、Sun:keytool - 鍵と証明書の管理ツールJava/keytool - 備忘録参照)

C:\Program Files\Java\jdk1.6.0_16\bin

キーストアのパスワードを入力してください:

新規パスワードを再入力してください:

姓名を入力してください。

[Unknown]: 3流PG

組織単位名を入力してください。

[Unknown]: 3流PG

組織名を入力してください。

[Unknown]: 3流PG

都市名または地域名を入力してください。

[Unknown]: xxxx

州名または地方名を入力してください。

[Unknown]: xxxx

この単位に該当する 2 文字の国番号を入力してください。

[Unknown]: jp

CN=3流PG, OU=3流PG, O=3流PG, L=xxxx, ST=xxxx, C=jp でよろしいですか?

[no]: yes

の鍵パスワードを入力してください。

(キーストアのパスワードと同じ場合は RETURN を押してください):

そして、作成した証明書を jarsigner を使って署名をします。(jarsigner の使い方は、Sun:jarsigner - JAR 署名および検証ツールJavaKey-03 JARファイルに署名をしてみよう。参照)

C:\Program Files\Java\jdk1.6.0_16\bin

警告:

署名者の証明書は 6 か月以内に期限切れになります。

■HTMLの作成

クライアントに JRE 入っていれば JNLP ファイルさえブラウザから叩けば動くんですが、JRE が入ってない場合はJREダウンページに誘導させたほうがいいみたいなことが Sun の開発者ページにあったんで、そのサンプルそのままんで、JNLP呼び出し用HTMLを作ります。

HTMLの内容は(Java)Java Web Start補足2[JNLP呼び出し用、JRE無に呼び出されるhtml]1を参照してください。

上記HTMLからJRE未インストール時に呼び出される download.html はこんな感じです。

HTMLの内容は(Java)Java Web Start補足2[JNLP呼び出し用、JRE無に呼び出されるhtml]2を参照してください。

■配備

これで、できた jnlp , 署名されたjar , html を WEBサーバにアップします。

後はブラウザでアクセスするだけ。

Javaのスプラッシュスクリーンが出た後、オレオレ証明書なので警告が出ます。

"実行"を押下するとちゃんと動きました。

ただ、テストの時はブラウザのキャッシュをクリアしながらやったほうがいいですね。

特にJNLPファイルを変更してサーバにアップしたときはキャッシュクリアしないとハマります。

Javaのスプラッシュスクリーンがでて動かない時とかは、JNLP のパス関係設定を正しいか疑ったほうがいいようです。

また、ダウンロードされたJARアプリケーション自体も JRE によりキャッシュされてるっぽいので、下記コマンドでクリアできるようです。

C:\Program Files\Java\jdk1.6.0_16\bin

■キャッシュの場所

上記でJARのキャッシュがクリアできることを書きましたが、実際にどこにキャッシュされているか調べてみました。

キャッシュ場所はJava Web Startのキャッシュファイルの行方 - cactusman日誌によると、コントロールパネル→Java→基本タブ→インターネット一時ファイルの設定から見れるようです。

同じく、インターネット一時ファイルの表示ボタンからはキャッシュされているアプリの一覧を見ることができ、ここからGUI操作で実行したり削除したりできるようです。

ただ、インターネット一時ファイルの設定からキャッシュフォルダの"変更"ボタンが押下できないんですよね。

Sun:システムおよびユーザレベルのプロパティによると、deployment.properties ファイルからキャッシュフォルダを定義できるようです。

(ユーザーレベルの deployment.properties ファイルは Vista 以降だと C:\Users\ユーザ名\AppData\LocalLow\Sun\Java\Deployment にあります)

試しに deployment.properties ファイルに下記設定を追加してみました。

deployment.user.cachedir=C\:\\c

すると、コンパネからJavaのGUI設定ツールから開いたときもインターネット一時ファイルの設定がちゃんと C:\c になっていました。

参考:

Sun:Java Web Start 1.5.0 開発者ガイド

デベロッパーズコーナー:Javaプログラミングを極める 第3回:Java Web Start

Java Web Start にさわる