EmacsでJava の環境構築、CEDETとyasnippetとmalabar-mode

JavaといえばEclipseなんだけど、Eclipseの重さが以前から気になっていたのと、CourseraのおかげでEmacsに慣れてきたので、EmacsJava開発環境を整える気分になりました。調べてみたらこちらがとても参考になります。

EmacsでJavaを書く - nekop's blog


JDEEというのもあってそちらを推してる記事もあったけど、上記のブログによるとJDK7の様々な機能に対応していないとのこと。初学者としての自分は、先達の知恵をとにかくそっくりそのまま模倣しようとおもいます。さて、anything.elはすでに導入済みなので、malabar-modeとyasnippetを入れることにします。


yasnippetは特に難しいことはなかった。github(GitHub - joaotavora/yasnippet: A template system for Emacs)からとってきて、.emacs.d/site-lisp以下に展開、init.elのload-pathに加えrequireするだけだから。しかしmalabar-modeは単純ではなかった。こちらの拡張はそのままでは使えず、事前にCEDETなるEmacs拡張を入れ、さらにmavenなるJavaのビルドツールにてmalabar-modeをビルドする必要があるそうだ。


...


なんだかこの時点で相当げんなりしてました。Vimで編集出来ればいいじゃないか、Emacsで面倒なことはやめようかなと何度か思った。だけど、とりあえずやるだけやってみよう。そう、なにしろ将来的にはいろいろJavaScalaで作りたいから。やったことを忘れないように書こう。


1. malabar-modeをgithub(GitHub - m0smith/malabar-mode: EMCS JVM Integration for Java and other JVM based languages)からとってきた。なにこれよくわかんない。
2. CEDETをsourceforge(CEDET download | SourceForge.net)からダウンロード、EMACS_HOME/.emacs.d/site-lispのしたに、cedet-1.1として展開
3. cedet-1.1のディレクトリに移り、以下のコマンドを打ち込む。なお、emacs.exeをフルパスで実行するのは大変なので、事前にemacs.exeへのaliasを作るかパスを通しおくと調子いい

emacs -Q -l cedet-build.el -f cedet-build


4. init.elに以下の記述を追加。たぶんこれでCEDETが動いてるんだろう。どうやって確認すればよいのかわからんが、メニュー−Toolsのしたに「Project Support (EDE)」とか出てくるからきっとうまく入ったのだろう。

(load-file "~/.emacs.d/site-lisp/cedet-1.1/common/cedet.el")
(global-ede-mode 1)                      ; Enable the Project management system
(semantic-load-enable-code-helpers)      ; Enable prototype help and smart completion 
(global-srecode-minor-mode 1)            ; Enable template insertion menu


5. Maven3をダウンロード(Maven – Download Apache Mavenより)。3.0.5というのを選んだ。
6. 自分のデスクトップ以下にdevというフォルダがあるので、そこにapache-maven-3.0.5を展開。
7. 環境変数JAVA_HOMEをJRE7のインストールパス(自分の場合はデスクトップ以下 dev/Java/jre7)を設定。
8. Mavenのbinディレクトリにパスを通す。
9. コマンドプロンプトから 「mvn --version」 とやって次のような表示がでればMavenは適切にインストールされているということ。

Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 22:51:28+0900)
Maven home: C:\Users\MY_NAME\Desktop\dev\apache-maven-3.0.5\bin\..
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: C:\Users\MY_NAME\Desktop\dev\Java\jre7
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"


10. これでやっとmalabar-modeをビルドする準備が整ったわけです
11. malabar-modeのpom.xmlがある階層に移動。コマンドプロンプトから「mvn package」を実行する。色々ダウンロードしてきてビルドしてくれる...のはずだが、エラーが出てビルドに失敗する。
12. mvnを-eと-Xオプションをつけて実行してみては?とMavenに提案をうけるので仰せに従う
13. とにかくエラーがどかどかでる。依存関係が解決できないらしい。ログをみると、maven-compat:jar:3.0-SNAPSOT is missingとでているので、あたりをつけてpom.xmlの3.0-SNAPSHOTを3.0.5にする
14. 再度Mavenを実行するとさらにいろいろダウンロードしてきて結構進むが、最後にJava compilerがみつからないとのエラーがでる。

Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
Unable to locate the Javac Compiler in:
  C:\Users\MY_NAME\Desktop\dev\Java\jre7\..\lib\tools.jar
Please ensure you are using JDK 1.4 or above and
not a JRE (the com.sun.tools.javac.Main class is required).
In most cases you can change the location of your Java
installation by setting the JAVA_HOME environment variable.


15. JAVA_HOMEをJREではなくJDKディレクトリに設定する。
16. javacをつかって、ビルドがすすむがまた変なエラー

Running org.grumblesmurf.malabar.ClasspathTest
Tests run: 7, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 6.931 sec <<< FAILURE!
Running org.grumblesmurf.malabar.GroovyServerTest
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 5.306 sec <<< FAILURE!
:
:
:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project malab
r: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\MY_NAME\Desktop\dev\OSS\from_github\malabar-mode\target\surefire-reports for the indiv
dual test results.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-
lugin:2.10:test (default-test) on project malabar: There are test failures.

Please refer to C:\Users\MY_NAME\Desktop\dev\OSS\from_github\malabar-mode\target\surefire-reports for the individual te
t results.


17. いい加減うんざりしてきたが、すなわち「org.slf4j.impl.StaticLoggerBinder」がCLASSPATHにはいってないからエラーがでてるんだろう、dependanciesに以下を追加。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.5.6</version>
    </dependency>


18. しかしそれでも失敗する。なんだかやけになってきた。とりあえず最初からやり直そうとおもって、一旦.m2のディレクトリをごっそり消して、手順17で追加したslf4jのあたりもコメントアウト、そして再度 mvn -e -X packageを行ったが、やはりだめ。テストで失敗しているようなので、そこを乗り越えたい。
19. こちら(malabar-modeのインストール - 飼育係(べべ)日記(2011-02-22))を参考に以下ビルドコマンドを変えてを打ち込む。テストスキップのオプションです。

mvn -e -X -Dmaven.test.skip=true package


20. Emacsのパスが通ってなかったのでエラーとなる。しかし、パスを一時的に通して再度手順19のコマンドを実行する
21. ビルドが完了して、malabar-1.5-SNAPSHOT-dist.zipができた。.emacs.d/site-lisp/malabar-mode以下に展開
22. malabar-modeのインストール手順をみて、init.elにCEDETインストールで記述したところをコメントアウトそして、最後の一行を追加

;; ====== CEDET ======
(load-file "~/.emacs.d/site-lisp/cedet-1.1/common/cedet.el")
;;(global-ede-mode 1)
;;(semantic-load-enable-code-helpers)
;;(global-srecode-minor-mode 1)
(semantic-load-enable-minimum-features)


23. init.elの以下追加。

;; ====== malabar-mode ======
(setq load-path (cons "~/.emacs.d/site-lisp/malabar-mode/lisp" load-path))
(require 'malabar-mode)
(setq malabar-grooby-lib-dir "~/.emacs.d/site-lisp/malabar-mode/lib")
(add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode))


24. Emacsを起動してJavaのコードを開くと、malabarなるメニューが追加されている。めでたしめでたし。
25. まったくマルっと真似するべくyasnippet-java-modeもいれました。こちらは、yasnippet/snippetsの階層にて、以下を行っただけです。

git clone https://github.com/nekop/yasnippet-java-mode java-mode


とにかくはまって大変でした、、、


(2013/04/6 12:24 手順18にリンクを張ってなかったので、追加した)