Emacs上でJDEEを使う際に、設定ではJDK1.6.0を指定しているのになぜかBeanShellの起動にJDK1.5.0が使用されてしまいます。ということで、Emacs Lispの世界へ潜入調査を行います。
追記)jde-jdk-registryにjdk1.5.0とjdk1.6.0を記述していると起きる現象のようです。jde-jdk-registryにjdk1.6.0だけ記述した場合、jdk1.6.0が使用されます。
Emacs Lispソースを追ってみる
まず、BeanShellを起動するファンクションを調べます。これは、"JDE"メニュー→"Interpreter"→"Start (C-c C-v C-k)"で起動するので、jde.elを開いてそれっぽい定義を探します。
(defcustom jde-key-bindings :<中略> (cons "[?\C-c ?\C-v ?\C-k]" 'jde-bsh-run)
jde-bsh-runという関数でBeanShellを起動しているようです。
続いて、jde-bsh-runの定義を探すとjde.elファイルの中にあります。
(defun jde-bsh-run() "*Starts the JDEE version of the BeanShell." (interactive) (bsh-launch (oref 'jde-bsh the-bsh) t))
bsh-launchの定義を探すと、beanshell.elにあります。
(defmethod bsh-launch ((this bsh) &optional display-buffer) :
うーんと、defmethodですか・・・。この定義のちょっと前に出てくるdefclass bsh () に対するメソッド定義なのかな?
このあたりが追いかけの限界のようで、Lisp素人では挫折。
Emacs Lispのデバッグ機能で追ってみる
ソースの追いかけで挫折してしまったので、今度はEmacs Lispのデバッグ機能を使って追いかけます。今回はエラーが出るわけではないので、指定した関数に処理が入るときにデバッグモードに入るdebug-on-entry設定を行います。さきほどBeanShellの起動で実行する関数がjde-bsh-runであることが判明しているので、この関数で引っ掛けます。
M-x debug-on-entry RET jde-bsh-run RET
で、実際にBeanShellを実行すると、*Backtrace*バッファが開きます。ここで、dキーを打つと一つ評価が行われます(ステップ実行のようなもの?)。
しばらくdキーを連打(押しっぱなしでキーリピート)していると、なにやら核心に近づきそうな、jde-run-get-vm()を評価しようとします。その先で、jde-java-version()を評価し、"1.5.0"との結果を取得しています。どうやら、BeanShellを起動すると、このjde-java-version()関数を評価し、現状は1.5.0が結果となっているようです。
(defun jde-java-version () "Get the version of Java used by the JDE." (interactive) (let ((java-version (if jde-jdk (car jde-jdk) (getenv (nth 0 jde-java-environment-variables))))) (if (not java-version) (if jde-java-version-cache (setq java-version jde-java-version-cache) (if (jde-bsh-running-p) (progn (setq jde-java-version-cache (jde-jeval-r "jde.util.JdeUtilities.getJavaVersion();")) (setq java-version jde-java-version-cache)) (setq java-version (jde-java-version-via-java))))) (if (interactive-p) (message java-version) java-version)))
jde-jdkの評価はM-x eval-expression RET jde-jdk で見ると、("1.5.0")となります。さて、customize-variableでjde-jdkの値は1.6.0に設定しているのですが、なぜ1.5.0になってしまうのか謎です。
jde-run.elやjde-compile.elを見ていると、
(defvar jde-run-virtual-machines (list (jde-run-vm-1-1 "JDK 1.1 vm") (jde-run-vm-1-2 "JDK 1.2 vm") (jde-run-vm-1-3 "JDK 1.3 vm") (jde-run-vm-1-4 "JDK 1.4 vm") (jde-run-vm-1-5 "JDK 1.5 vm")) "*List of supported virtual machines.")
や
(defvar jde-compile-javac-compilers (list (jde-compile-javac-11 "javac 1.1.x") (jde-compile-javac-12 "javac 1.2.x") (jde-compile-javac-13 "javac 1.3.x") (jde-compile-javac-14 "javac 1.4.x") (jde-compile-javac-15 "javac 1.5.x")) "List of supported javac compilers.")
といった記述が見られます。どうやら、jdk 6に対応させるには少し手をいれないといけないようです。
今日の追いかけはまずはここまで