デベロッパーズコーナー:Javaプログラミングを極める「Java Web Start(その2)」
2002年12月11日作成
Javaプログラミングを極める
第4回:Java Web Start(その2)
(株)日本ユニテック
太田 純
<この記事はDigital Xpress 2002 Vol.10(8-9月号)に掲載されたものです>
前回はJ2SE (Java 2 Platform Standard Edition) 1.4 の新機能Java Web Start を紹介しました。Java Web Start は、Java アプリケーションをWeb ブラウザから起動する技術です。今回はJava Web Start で動作するアプリケーションを記述し、特にXML を扱う場合の考慮事項を扱っていきます。 |
Java Web Start の機能を利用すると、Java プログラムをWeb ブラウザから起動し、ヘルパーアプリケーションの形態で実行することができます。前回の記事の中で、Java
Web Start を利用したアプリケーションはHTML 文書と同様に簡単にクライアントへ配布でき、ローカルアプリケーションと同様の使いやすいGUI
を利用できることを紹介しました。また、JNLP ファイルの記述方法についても簡単に説明しました。
Java Web Start アプリケーションは、Applet と同様のsand box 内で実行されます。つまり、ローカルディスクへのアクセスが制限され、ネットワーク接続はダウンロード元のホストに限定されます。
Java Web Start からXML にアクセスする
さて、今回取り上げたいのはXML ファイルにアクセスするJava Web Start アプリケーションです。リスト1をご覧ください。ダウンロード元のホストにあるXML
ファイルを読み込み、フレームに表示するプログラムです。
【リスト1:JWSTest.java】
package jp.co.utj.samples;
import javax.swing.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.jnlp.*;
public class JWSTest {
public static void main(String[]
args) {
try {
DocumentBuilderFactory dbfactory
= DocumentBuilderFactory.newInstance();
DocumentBuilder
builder = dbfactory.newDocumentBuilder();
Document
d = builder.parse(getCodeBaseString() + "test.xml");
JFrame
frame = new JFrame("JWSTest");
final
JLabel label = new JLabel(d.getDocumentElement().getFirstChild().getNodeValue());
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
} catch(Exception
e) {
JOptionPane.showMessageDialog(null,
e.getMessage(),"JWSTest", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
static String getCodeBaseString()
{
try {
BasicService
bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
return bs.getCodeBase().toString();
} catch(UnavailableServiceException
ex) {
return
"";
}
}
} |
実は、このプログラムをjar ファイルにしてJNLPフ ァイルと共に配置するだけでは動作しません。最初にDocumentBuilderFactory
を作成しようとするだけでアクセスが拒否されるのです(図1参照)。これは不思議なことに思えるでしょう。ローカルファイルにアクセスしようとしているわけではありません。sand
box 内からダウンロード元のホスト上のファイルへのアクセスは許可されているはずではないでしょうか。(注1)
【図1:access denied エラーが発生】
再度、エラーメッセージをよく見ると発生しているのは PropertyPermission に 対するエラーであるこ とが読み取れます。これはJAXP
がローカル環境のシステムプロパティにアクセスするために発生するのです。DocumentBuilderFactory は、使用するXML
プロセッサを決定するためにjavax.xml.parsers.Docu mentBuilderFactory システムプロパティを読み取ります。
それで、JAXP を使うJava Web Start アプリケーションを正しく動作させるには、以下の2 つの処理が必要となります。
- ・jarファイルに署名する
- ・JNLPファイルにセキュリティの設定を記述する
jar ファイルへの署名は、ちょうどローカルファイルにアクセスする Applet を作成する場合と同様に行うことができます。署名の生成と付加についてはSun
Microsystems のサイトやさまざまな解説書で説明されていますので確認してください。
次に、JNLP ファイルにセキュリティの設定を記述します(リスト2参照)。JNLP ファイルにsecurity
要素を記述し、その子要素としてここではj2ee-application-clie nt-permissions を指定しました。セキュリティ設定として指定できるのは、このj2ee-application-cli
ent-permissions(J2EE アプリケーションクライアント用の設定)とall-permissions(すべてのアクセスを許可)のどちらかです。この2
つの設定の差異についてはJNLP のドキュメントで確認してください。どちらにしても、ローカルファイルとネットワークファイルに対する無制限のアクセスが許可されることになります。
【リスト2:JWSTest.jnlp】
<?xml version="1.0"?>
<jnlp spec="1.0+" codebase="http://jun-o76i20n8ef3/samples"
href="JWSTest.jnlp">
<information>
<title>JWS Test Application</title>
<vendor>UTRI</vendor>
<homepage href="http://jun-o76i20n8ef3/samples/JWSTest.html"/>
<description>Java Web Start Sample Application</description>
<description kind="short">Java Web Start
サンプルです。XML ファイルを取得して内容を表示します。</description>
<icon href="JWSTest.jpg"/>
</information>
<security>
<j2ee-application-client-permissions/>
</security>
<resources>
<j2se version="1.2+"/>
<jar href="JWSTest.jar"/>
</resources>
<application-desc main-class="jp.co.utj.samples.JWSTest"/>
</jnlp> |
署名とJNLP ファイルの書替えができたら、再度クライアントから JNLPファイルにアクセスしてみましょう。今度はエラーにならずに図2または図3のどちらかの警告ダイアログが表示されるようになります。ユーザがこのダイアログで「開始」ボタンを選択すればプログラムが実行されます。この2つのダイアログの違いはjar
ファイルに付いている署名が認証局によって確認されたものかどうかによります。確認できなかった場合は図2の表示、確認できた場合は図3の表示になります。(注2)
【図2:セキュリティ警告ダイアログ(その1)】
【図3:セキュリティ警告ダイアログ(その2)】
ローカルな証明書サーバを使っている場合など、Java Web Start が認識する証明機関による証明書でない場合は図2
の表示になります。その場合は、「Java Web Start アプリケーションマネージャ」を起動してから以下の手順で証明書ファイルを登録します。
- 1) [ ファイル]メニューの[ 設定] を選択して「Java Web Start - 設定」ダイアログを表示させる
- 2) [ ルート証明書]-[ 証明書のパス] のタブを選択し、[ インポート ] ボタンを選択(図4参照)
- 3) ファイル選択ダイアログが表示されるので、登録したい証明書ファイルを指定
【図4:Java Web Startアプリケーションマネージャの設定ダイアログ】
この処理を行えば、図2ではなく図3の表示をさせることができます。
JNLP API
JNLP API とは、JNLP アプリケーション特有の処理や情報の取得をするために用意されているAPI であり、javax.jnlp
パッケージに含まれるいくつかのクラスが含まれています。BasicService クラスは、アプリケーションのダウンロード元に関する情報や、現在の実行環境に関する情報を取得するために使うことができます。他のクラスのほとんどは、署名されていないアプリケーションがローカル環境にアクセスするために用いられます。たとえば、FileOpenService
やFileSaveService はローカルディスクにあるファイルの読み込みや書き出しを行うために用いられます。どちらの場合もアプリケーション側からはファイル名を知ることはできず、ファイルの内容だけにアクセスできるように保護されています。リスト1の中のgetCodeBaseString
メソッドはBaseService を用いてダウンロード元のコードベースを知る ための手順を示しています。ServiceManager を通じてBaseService オブジェクトを取得すると、BaseService のメソッド getCodeBase を呼び出すことができます。
JNLP API を使うアプリケーションを開発するための環境は J2SE 1.4 SDK には含まれていません。下記のサイトから「JNLP開発者向けパック」をダウンロードする必要があります。
http://java.sun.com/products/javawebstart/ja/developers_ja.html
ダウンロードして解凍すると、必要なjar ファイルとドキュメントが入手できます。JNLP API を使用するソースファイルをコンパイルするときには、jnlp.jar
をclasspath に含めます。
javac -classpath jnlp.jar *.java |
このjar ファイルを配布する必要はありません。Java Web Start の実行環境があれば、jnlp.jar なしに実行することができます。
まとめ
前回から2 回にわたってJava Web Start とJNLP について解説してきました。現状ではセキュリティ設定を「JAXP
を使えない設定」か、または「ローカルディスクすべてにアクセスできる設定」のどちらかにしかできないのは残念なことです。ぜひ
Java Web Start の次のバージョンではJAXP などのXML API と組み合わせて、適切な権限設定で使えるように改善していただきたいものです。
とはいえ、容易な配布手順と豊富なGUI を実現するためにJava Web Start は優れた手段となります。システム構成を決める際にぜひ考慮に入れていきたいものです。
(注1) ダウンロードもとのアドレスを取得する方法については「JNLP
API」の項目で説明します。
(注2)「発行元の信頼性の検証者」には通常、認証局の名前が表示されます。ここではローカル環境で証明書を作成したので「署名および配布元」と同じ名前が表示されています。
関連サービス
IT技術およびIT製品の可用性調査・検証業務