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

前回の 『Java Web Start で Groovy アプリを公開してみる その1』 から間が開いてしまったので少しおさらい。
前回は

Java で実装したアプリは 署名がなくてもサンドボックス内で実行できるのに...
同じアプリを Groovy で実装すると 署名がないとサンドボックス内でさえも実行できなくなる。
という話だった。

本来 Java でも Groovy でも サンドボックス内で実行するのであれば 署名など必要ないはずなのに...
そもそも なぜ Groovy で実装したアプリには署名をつけて公開しなくてはならないのか というと...
自分が実装した myapp.jar にではなく、Groovy のライブラリ groovy-all.jar に全ての権限を与えなくてはならないから...

つまり、本来は

  • groovy-all.jar は署名あり
  • myapp.jar は署名なし
で公開すれば良いってこと...

実は これを実現するための機能が JNLP には用意されている。それが

component-desc
いくつかの JAR ファイルをまとめて 再利用可能なコンポーネントとして公開するための要素
extension
コンポーネントJNLP ファイルに取り込んで利用するための要素
である。

例えば...
JavaFX Runtime の JAR ファイル群は この機能を利用して公開され 各アプリケーションで利用できるようになっている。
もちろん JavaFX Runtime の JAR ファイルは署名されていて 全ての権限が与えられている。
しかし、それを利用するアプリケーション自体がサンドボックスで実行できるのであれば そのアプリケーション自体には署名する必要などない。

と言うことで この機能を使えば...
コンポーネントには全ての権限を与え、アプリケーション自体にはサンドボックスの権限だけと言うことができる。

Groovy の場合も この機能を利用して groovy-all.jar をコンポーネントとして公開すれば groovy-all.jar にのみ署名して全ての権限を与えることはできる。
そうすれば、それを利用するアプリケーション自体は署名が必須ではなくなる。
これが 『Java Web Start 版 Groovy アプリのコード署名は必須ではなかった...』 での話...
と言っても、現段階ではそう簡単でもないのだが...

と言うのも...
このコンポーネントは本来 CodehausOracle のような 信用のある企業なり団体によって署名され公開されなくては意味がない。
寂しい話だが、現段階では 各自 オレオレ証明書で署名して公開せざるおえず、結局 セキュリティの警告がでてしまう。
JavaFX というと表面的な部分に注目されがちだが、 こういった基盤部分もちゃんとしていたのだと改めて実感する。
Groovy や 他の言語も そうなることを願うしかない...

と言うことで...
この機能を使って サンドボックス内で実行できる 安全な Groovy アプリを公開してみる...

← こんな感じで実行できる。

ただし、上述の通り grovy-all.jar をオレオレ証明書で署名しているため

のような警告はでる。
しかし、前回とは少し違う。

と言うのも...
このセキュリティの警告は 『My Application 3』 に対してではなく 『Groovy Runtime』に対するものだからだ。
もし、『Groovy Runtime』 が ちゃんと信頼される証明書で署名されていて ユーザが常にそれを許可するのであれば...
Groovy で実装したアプリケーションでも セキュリティの警告なしで実行できる。

では、早速 groovy-all.jar だけをコンポーネントとして公開する方法...
アプリケーションを公開する JNLP ファイルとの違いは 最後の だけ...
もちろん groovy-all.jar には全ての権限を与えなくてはならないので 署名 と all-permissions 要素が必要だ。
上述の通り 今回も オレオレ証明書で署名している。

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
      codebase="http://xxx.groovy.codehaus.org/"
      href="groovy-all.jnlp">
  <information>
    <title>Groovy Runtime</title>
    <vendor>Codehaus</vendor>
    <homepage href="http://groovy.codehaus.org/"/>
  </information>
  <security>
    <all-permissions />
  </secutiry>
  <update check="background"/>
  <resources>
    <jar href="groovy-all.jar"/>
  </resources>
  <component-desc />
</jnlp>

次に 実際に Groovy で実装したアプリを公開する方法...
Groovy で実装したアプリは 以下の JNLP ファイルで公開する。
もちろん、このアプリはサンドボックス内で実行できるため 署名も security 要素も必要ない。
extension 要素を追加して 上記のコンポーネントを読み込むようにするだけ...

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://example.com/" href="myapp.jnlp">
  <information>
    <title>My Application</title>
    <vendor>bluepapa32</vendor>
    <homepage href="http://d.hatena.ne.jp/bluepapa32/"/>
  </information>
  <update check="background"/>
  <resources>
    <java version="1.5+"/>
    <jar href="myapp.jar" main="true"/>
    <extension href="http://xxx.groovy.codehaus.org/groovy-all.jnlp" />
  </resources>
  <application-desc main-class="myapp.Main" />
</jnlp>

今回は JNLP の機能を利用して セキュリティ権限の異なる JAR ファイルを公開する方法についてまとめてみた。
ところが、この機能はちゃんとそれを考慮した実装がされていないと正しく機能しない。
実際、Groovy の SwingBuilder の実装は それが考慮されていないため 今回のように公開しても正しく実行できない。
それが 前回 SwingBuilder を利用しなかった理由である。
これについては また次回...