Java Web Start で Groovy アプリを公開してみる その1

前回の 『Java Web Start 版 Groovy アプリのコード署名は必須ではなかった...』 が抽象的でちょとイメージがしにくかったので 具体的にまとめてみることにした。

このテーマでは 次のような全く意味のないアプリケーションを Java Web Start で公開することを考えてみることに...

このアプリケーションは ウィンドウに "Hello, World!" と表示するだけなので サンドボックスの制限内で実行できる安全なアプリケーションであることは言うまでもない。

では まずは 基本中の基本からと言うことで

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JLabel("Hello, World!"));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
    }
}
のように Java で実装して
http://example.com
  +- myapp.jar
  +- myapp.jnlp
という構成で 署名せずに Java Web Start で公開してみる。

← もちろん、こんな感じで実行できる。

ところが 全く同じコードを

import javax.swing.*;

JFrame frame = new JFrame();
frame.add(new JLabel("Hello, World!"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
のように Groovy で実装して
http://example.com
  +- myapp.jar         <-- Groovy スクリプトをコンパイルしたクラスファイルを含む JAR ファイル
  +- groovy-all.jar    <-- Groovy 実行用ライブラリ
  +- myapp.jnlp
という同じような構成で 署名せずに Java Web Start で公開しても エラーで実行できない。
処理自体は Java 版と全く同じなのに...

← こんな感じでエラーになる...

ちなみに 話は変わるが 今回は SwingBuilder をあえて使っていない。
Java のコードに合わせるためという理由もあるが、 一番の理由は SwingBuilder の Permission 関係の不具合で 今回やりたいことがうまくできないことがわかったから...
この不具合については このテーマにも関係するので 詳細は次回以降に...

で話を戻すと...
これが『Java Web Start 版の Groovy アプリはコード署名が必須らしい』 の現象なのだが...
これを 回避する方法として

公開する全ての JAR ファイルに対し 権限を与える
という方法が一般的に行われているのが現状だろう。
今回の場合であれば
  • myapp.jar
  • groovy-all.jar
に署名をつけて myapp.jnlp
<security>
  <all-permissions/>
</security>
を追加すればよい。

← こんな感じで実行できるようになる...

もちろん今回もオレオレ証明書で 署名しているので 当然



のような警告はでるが、実際にはサンドボックスの制限内で実行できる安全なアプリであるので 許可しても問題ないだろう...
ただし、公開しているアプリが改竄されている可能性は否定できないので あくまで自己責任で...
これが オレオレ証明書で署名されたアプリの怖いところ...

ここまでの話を少しまとめると...

Java で実装した場合は署名なしで実行できるアプリが Groovy で実装すると署名なしでは実行できなくなる。
本来 Java でも Groovy でも myapp.jar 自体はサンドボックス内で実行できるため どちらも署名など必要はないはずなのに...

実は これは JNLP の仕組みをちゃんと理解せずに Groovy で実装したアプリを公開していることに問題がある。
と言うことで 次回に続く...