torutkのブログ

ソフトウェア・エンジニアのブログ

Emacs JDEEのBeanShell起動用JDKバージョンの制御

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に対応させるには少し手をいれないといけないようです。

今日の追いかけはまずはここまで