JavaScriptからJavaアプレットを呼び出すコードの動作確認で、呼び出し先のJavaアプレットがどこまで処理されているのか確認するため、Java Consoleが使えました。
Java Consoleを使うまでは、Javaアプレット中のオブジェクトがundefinedになってしまう原因がまったくわからず困っていたのですが、Java ConsoleにはJavaアプレットのSystem.out.println()の出力結果が表示されたり、JVMでどういうエラーが発生しているのか表示されたりするので助かりました。
ちなみに私のコーディングミスは、archive属性の指定方法にありました。ブラウザだけではarchive属性に指定したJARファイルが無かったとしても、エラー表示されないようです。エラー内容はJava Consoleを見てはじめて判りました。
Java Consoleを有効にする
WindowsであればコントロールパネルのJavaから設定すると思いますが、例えばCentOSでは以下のようにしました。
$ cd $JAVA_HOME/jre/bin
$ ./ControlPanel
詳細タブ の Javaコンソール でコンソールを表示する、を選択しておく。これでJavaアプレットを実行するとそのタイミングでJava Consoleウィンドウが自動で表示されます。
トレースレベルを 5 (詳細)にしておくとJVMが何をしているのか詳細が表示されます。
以下、最終的に動作確認できたコードを挙げておきます。
サンプルコード
環境
- CentOS 6(サーバ/クライアント)
- Apache 2.2.15
- ブラウザ Chromium 31.0/Firefox 35.0.1(Javaアプレットを有効にしています)
- Java SE 1.8.0_25
ファイル構造
public_html
├── applet
│ ├── VMInfo.jar
│ ├── VMInfo.java
│ ├── VMInfo.mf
│ └── make_jar.sh
├── js
│ └── main.js
└── main.html
main.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<APPLET name="VMInfoApplet" CODE="VMInfo" ARCHIVE="applet/VMInfo.jar" HEIGHT="120" WIDTH="400" mayscript="true">
<param name="port" value="10000">
このブラウザではアプレットがサポートされていません。
</applet>
<script src="js/main.js"></script>
</body>
</html>
main.js
var VMInfo = {
notify : function(info){
console.log(info);
var version = info.version || "";
var vendor = info.vendor || "";
window.alert([version, vendor]);
}
};
VMInfo.java(Javaアプレット)
import java.applet.Applet;
import java.awt.TextField;
import netscape.javascript.JSObject;
public class VMInfo extends java.applet.Applet {
public String jreVersion = "";
public String jreVendor = "";
private TextField versionField;
private TextField vendorField;
public String getJreVersion() {
return this.jreVersion;
}
public void init() {
System.out.println("port is " + this.getParameter("port"));
this.jreVersion = System.getProperty("java.version");
this.jreVendor = System.getProperty("java.vendor");
this.versionField = new TextField(jreVersion, jreVersion.length());
this.vendorField = new TextField(jreVendor, jreVendor.length());
add(versionField);
add(vendorField);
// callback
JSObject win = JSObject.getWindow(this);
String jsContext = "VMInfo.notify({\"version\":\"" + jreVersion + "\", \"vendor\":\"" + jreVendor + "\"})";
win.eval(jsContext);
}
}
make_jar.sh
# !/bin/sh
javac -d . VMInfo.java
jar -cvfm VMInfo.jar VMInfo.mf VMInfo.class