読者です 読者をやめる 読者になる 読者になる

「Java」アプレットを実行する JRE のバージョンを指定する方法

Java アプレットを実行する JRE のバージョンを指定する方法について調べたので、その時のメモ。

ちなみに、実行環境は以下

Windows 7 SP1
Internet Explorer 10
JRE 6 Update 45
JRE 7 Update 25 ( 2013/07/09 時点の最新バージョン )
※ Java はどちらも 32bit 版を使用

上記の環境で Java アプレットJRE 6 Update 45 で動作させたい。

JRE のバージョンを指定する方法について、オラクル社のドキュメントには以下のような情報がある。

アプレット配備
http://docs.oracle.com/javase/jp/7/technotes/guides/jweb/applet/applet_deployment.html

ドキュメントの内容踏まえると
1. APPLET タグに PARAM 要素を設定
2. OBJECT タグに "classid 属性" を設定
あたりで JRE のバージョン指定ができそうである。

今回は 2 の方法でやってみようと思います。
ひとまず、Java アプレットを用意する。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;

public class AppletJREVersion extends Applet{

        public void init(){
        }
        
        public void paint(Graphics g) {
                g.drawString(System.getProperty("java.version"),10,10); 
                
                	System.out.println(System.getProperty("java.version"));
        }
        
}
<html>
<head>
<title>Applet Test</title>
</head>
<body>
<object 
    classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"
    codebase="http://www.example.com/out-of-proc-plugin-url-placeholder.exe#1,6,0,0"
    width="200" height="200">
      <param name="code" value="AppletJREVersion.class">
  </object>

<!-- applet タグ使用した検証も一応したのでその時のもの
<applet code="AppletJREVersion.class" width="200" height="200">
  <param name="java_version" value="1.6.0_45">
</applet>
-->
</body>
</html>

あと、デフォルトのセキュリティ設定では、署名なし、自己署名の Java アプレットが旧バージョン
JRE では実行できないので、Java コントロールパネルのセキュリティ設定を "中" に変更しておく。

それで、Java アプレットを適当に Web サーバ上に配置してブラウザからアクセスする。
すると以下の感じの例外が発生。

java.lang.SecurityException: User declined to run unsigned sandbox app

JRE 6 Update 45 で実行することは成功しているけど、肝心の Java アプレットが正常に動作
してくれない。なんか "署名のないサンドボックアプリの実行を取りやめました" 的な内容
と読める ( そのままだけど )。
ただこの例外、Web 探してもほとんど情報がない・・・
署名付きアプレットで試してみてもダメ・・・

いろいろ悩んだあげく、また、有識者の助言もいただきながら、「次世代 Java プラグイン」を
無効にして再度検証してみた。すると、JRE 6 Update 45 で正常にアプレットの実行に成功した。

原因とかわからないけど、ひとまず目的は達成!!
あくまで簡単な検証なので、同じ動作となることは保証できないので、その点はご了承ください。
以上です。


■ 参考
ドキュメントで紹介されている 1 の方法 ( APPLET タグ内で PARAM 要素を設定する ) についても
簡単に試してみた結果、こっちはうまくいかなかった。
具体的には
・次世代 Java プラグインを有効で、"java.lang.SecurityException: User declined to run
unsigned sandbox app" が発生。
・次世代 Java プラグインを無効だど、JRE 7 Update 25 で実行されてしまう。

ただ、1 の方法 JRE 7 Update 25 がインストールされている環境でのみうまくいかない。
その端末にインストールされている最新の JRE のバージョンが JRE 7 Update 21 とかだと
うまくいった。