code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

deployJava.jsはなぜ1.4.2以降のJavaしか判定しないのか

Java 配備ツールキット (Java Deployment Toolkit)という仕組みがJava6.0u10から提供されるようになった(FAQ)。

これはなに。っていうと先日も書いたが、SWFObjectとexpressInstall.swfのようなものである。つまり、バージョン判定および必要に応じてプラグインのインストール、そしてブラウザに合ったHTMLタグを生成してくれる。もちろんJavaアプレットとJava Web Start専用である。

環境はWindows 7 Professional 64bit上のXP Mode上のIE6sp3。

このツールキットに付属するものとしてdeployJava.jsというスクリプトがある。ソースコードを読んでみると、なぜかJREの1.4.2以上+Microsoft VMの判定だけとなっている。

これはなんでかなー、ということで調べてみた結果。

MS Javaの判定

これは普通に判定してくれない。HTMLに次のようなコードがある場合に探してくれるようだ。Is Microsoft virtual machine Installed?あたりに似たコードがある。

<msie:clientcaps style="behavior:url(#default#clientcaps);" id="oClientCaps" />

ブラウザーの機能と Internet Explorer 5. 0 クライアントの機能を使用clientCaps Behaviorなどによると元々はIIS+ASPの構成用のクライアント機能を調べるタグだったようである。と、過去形にしてしまったがIE9で上記ページを見てもバージョン番号を返すのでまだ現役の機能のようである。

MS Javaだけの状態でdeployJava.getJREs()のテストHTMLにアクセスしてみると1.1というバージョンが出る。

またMS Javaはappletタグが動作する。

Sun Java 1.1

1.1ではJREとプラグインはインストーラが異なる。JREは配布されているが、プラグインのインストーラーは、もうSun(Oracle)で配布していないようである。がんばって探すとplugin-1_1_3_007-windows-i586-i.exeというファイルが怪しいサイトで見つかるので、一応試してみた。

JDK1.1でコンパイルしたJavaアプレットを起動してアプレット内でSystem.getProperty("java.version");すると1.1.8と返ってきた(objectタグ)。appletタグは1.1.4(つまりMS Java)のまま。

ActiveXのクラス名はJavaSoft.JavaBeansBridge.1(CLSID: {8AD9C840-044E-11D1-B3E9-00805F499D93}、表示名: JavaBeansBridge.Object)。

NPAPIっぽいプラグインがあったのでFirefox9.0.1のPluginsフォルダ(無かったので作成)に配置してみたが(NPJava11.dll, NPJava32.dll)、認識せず。

JavaScriptではnew ActiveXObject('JavaSoft.JavaBeansBridge.1');とすれば良さそうだが、どこかの海外サイトではこのクラスのオブジェクトを作成するとJavaコンソールが起動してしまう、というのを見た。

またここで書いてしまうが、1.2も1.3のプラグインもインスタンス化するには同じJavaSoft.JavaBeansBridge.1のProgIDしか使えず、1.1/1.2/1.3の判別ができなかった(試した環境ではJavaPlugin.12やJavaPlugin.130は認識せず、レジストリにもProgIDのキーはなし。)。

Java Plugin DetectorDetecting plugins in Internet Explorer (and a few hints for all the others)のようにサーバーにアプレットを用意してロードしたものをJavaScriptで読み込めば完全に区別できるんだろうが、deployJava.jsでは行っていない。SWFObjectと同じでそんなにバージョン判定は頑張らない方針なんでしょう。

Sun Java 1.2

1.1とそんな変わらず、相変わらずappletタグではMS Javaが動き、objectタグでしかアプレットを呼べない。

NPAPIっぽいファイルが増えていたが(npjava11.dll, npjava12.dll, npjava122_017.dll, npjava32.dll)、相変わらずFirefoxでは認識しない。

Operaがプラグインを認識するがアプレットは動作せず。

Sun Java 1.3

1.2からはだいぶ変化がある。

まずコントロールパネルにJavaのアイコンが登場する。Netscapeは有効にできないが、IEのオン・オフはここからできる。ちなみにオフにしたらappletタグの方でMS Javaが呼び出されるようになった。

object, appletタグどちらも1.3.1_20を表示するようになる。

FirefoxのPluginsフォルダにNPAPIファイルがコピーされ、相変わらずFirefoxは認識してくれないが、Chromeが認識するようになる。deployJava.jsではバージョンをうまく取得できたのだが、バージョンを表示するだけのアプレットを表示しようとしたところ、Javaがクラッシュしてしまった。

データ実行防止
コンピュータ保護のため、このプログラムはWindowsにより終了されました。

マイコンピュータ→プロパティ→詳細設定→パフォーマンス→データ実行防止→次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする。にチェックをつけてGoogle Chromeとかrundll32.exeとかjvm.dllを登録してみたが、結局実行できず。

C:\boot.iniを/NoExecute=AlwaysOffに変更して再起動して試してみたところ、Javaコンソールまでは出たがアプレットは描画されなかった。しかもしばらくするとChrome自体が落ちてしまった。

またJRE 1.3をアンインストールするとレジストリは元に戻してくれないらしく、MS Javaすら使えなくなってしまう。

1.1/1.2/1.3はどうにも区別できない

アプレットをロードしない限り、IE上では1.1から1.3の区別はできなそうである。

deployJava.jsを参考にjQuery使ってobjectタグでclsid:8AD9C840-044E-11D1-B3E9-00805F499D93(ProgID=JavaSoft.JavaBeansBridge.1), clsid:CAFEEFAC-0013-0001-0020-ABCDEFFEDCBB(Java Plug-in 1.3.1_20<applet> リダイレクタ), clsid:CAFEEFAC-0013-0001-0020-ABCDEFFEDCBA(Java Plug-in 1.3.1_20)をそれぞれ埋め込んでみようとしたのだが、

$('body').append($('<object id="jre" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" />'));
$('body').append($('<object id="jre" classid="clsid:CAFEEFAC-0013-0001-0020-ABCDEFFEDCBB" />'));
→ IEが落ちる。HTMLに直接書いても何もプロパティが取れない。
$('body').append($('<object id="jre" classid="clsid:CAFEEFAC-0013-0001-0020-ABCDEFFEDCBA" />'));
→ 埋め込みは成功するが同様に何もプロパティが取れない。

Visual StudioのExpress使ってCOMコンポーネントとして読み込もうとしたけど、一覧に表示されず。直接参照しようとすると'C:\Program Files\JavaSoft\JRE\1.3.1_20\bin\NPJava131_20.dll'への参照を追加できませんでした。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。というエラー。OLEVIEW.exeでは見えるので、ActiveX(OLE)であってCOMではない、、、ということかなー。このあたりはよく分からんです。

これらのコンポーネントには外部から参照する用のエクスポートされたプロパティや関数はないようだ。

なぜ1.4.2以降か

1.4.2より前のバージョンをなぜ判定しないのか、の答えは『アプレットを読み込まないと取れないから』と『古いJREだとブラウザやプラグインがクラッシュするか』とかが有力そう。MS Javaをなぜ判定(しかも限られた状況だけ)しているかはよく分からないが、どこかで普及しているのかな。

バージョン判定に使えるか

元々はJREのバージョン判定ライブラリを探すなり作ろうとしていたが、ここまで調べた結果、deployJava.jsをベースに作っちゃって良さそうな感じ。

JREが1.4.2より前なんて、お役所のサイトでもさすがにもう使ってないんじゃないでしょうか。全く使ったことないんで未確認ですが。

難点はChromeで見るとスクリプトを取り込んだだけで、Javaを実行しますよ?って出ちゃうことくらいかな。プラグイン用のタグを埋め込むあたりで出ているようなので、バージョン判定だけに使う場合は、埋め込みを削除したコードを作った方がいいかもしれない。

関連記事
タグ:Java JavaScript
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。