備忘録

いろいろ忘れないためのブログ

Java8をemacs-quickrunでコンパイルする

| Comments

EmacsのquickrunでJavaを動かすというニッチな人向けです。

Java8を入れてみた

Java SE 8が先日リリースされたので試しに使ってみることにしました。普段のコンパ イラはJava7のままにしたかったので、Java8の javacjavajavac8java8 というシンボリックリンクを作って利用することにしました。

これをEmacsのquickrunでコンパイル&実行したいので、マニュアル通り

(quickrun-add-command  "java8"
                       '((:command . "java8")
                         (:compile-only . "javac8 -Werror %o %s")
                         (:exec    . ("javac8 %o %s" "%c %N %a"))
                         (:cmdopt . "-encoding UTF-8")
                         (:remove  . ("%n.class"))
                         (:description . "Compile Java8 file and execute")))

として、Java8用の "java8" というコマンドを追加しました。

これでquickrunを実行してみると

qr_65243Cj.java:4: エラー: クラスHogeはpublicであり、ファイルHoge.javaで宣言する必要があります
public class Hoge {
       ^
エラー1個

とか怒られました。そういえばquickrunは一時ファイルを作ってそれをコンパイルする はずなので、ファイル名とクラス名が一致しなくて怒られる。

でも既存のJavaであればquickrunを利用できるはずだけどな? と思ってquickrunのソー スを読むとJavaとGoだけは一時ファイルを利用しないらしい。

(defsubst quickrun/use-tempfile-p (cmd-key)
  (not (or (member cmd-key '("java" "go/go")) quickrun/compile-only-flag)))

なのでこの関数をアドバイスすることにした。

(defadvice quickrun/use-tempfile-p (after java8 activate)
  "Java8でも一時ファイルを作らないようアドバイス"
  (when (string= (ad-get-arg 0) "java8")
    (setq ad-return-value nil)))

これで無事コンパイル&実行できました。無理やりだけどいいことにしよう。

Comments