Mac OS X El CapitanやmacOS SierraでMeCabのJavaバインドを使用する

初投稿です。JavaでMeCabを使用しなければならない機会があったのですが、どうも一筋縄ではいきませんでしたので、メモしておきます。最終目標は、Eclipseでの使用です。
なお、自分でもやっていることをすべて理解しているわけではありませんので、予めご了承ください。

#想定環境
以下の環境で行いました。なお、Sierraでも同じようにしてインストールできたことを確認しております。

* OS：Mac OS X El Capitan 10.11.3
* PC：MacBook Air (11-inchi, Mid 2012)
* Java：1.8.0_45
* その他：予めXcode6.1.1(6A2008a)をインストール済み

#あらかじめインストールしておくもの

Xcode及びJava JDKをインストールしておいてください。

#MeCabのインストール
Javaとか関係なしに、まずはMeCabのインストールを行います。パッケージ管理ソフトであるHomebrewを使用する方法もありますが、私は[公式配布ページ](http://taku910.github.io/mecab/ "MeCab: Yet Another Part-of-Speech and Morphological Analyzer")からダウンロードしてインストールしました。
本体と辞書の２つをインストールする必要があります。執筆時点では、MeCab本体は**mecab-0.996.tar.gz**が最新でした。辞書は推奨とされている**IPA 辞書**を使いました。
それぞれのインストール方法は、[同じページ](http://taku910.github.io/mecab/#install-unix "MeCab: UNIXでのインストール方法")にわかりやすく書かれていますのでそちらをご覧ください。

#Javaバインディングのコンパイル
ここが一つ目のネックの部分になります。
とりあえず、先ほどと同じ[公式配布ページ](http://taku910.github.io/mecab/ "MeCab: Yet Another Part-of-Speech and Morphological Analyzer")内のリンクからJavaバインディングをダウンロードします。（Google Driveでの配布となります。）

![ダウンロードリンク](https://qiita-image-store.s3.amazonaws.com/0/84550/cb525ef8-e085-98cf-929f-f9fda261c2be.png)

インストールしたMeCabのバージョンと同じものを使用するのがいいと思いますので、**mecab-java-0.996.tar.gz**をダウンロードしました。

![ダウンロードするファイル](https://qiita-image-store.s3.amazonaws.com/0/84550/6260cd18-9d94-4b96-5a3b-7d6841253a87.png)

ターミナル上で解凍し、そのままmakeしてみます。

```bash
tar zxfv mecab-java-0.996.tar.gz
cd mecab-java-0.996
sudo make
```

すると、以下のようなエラーが返ってきました。

```bash
c++ -O3 -c -fpic MeCab_wrap.cxx  `mecab-config --cflags` -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux
MeCab_wrap.cxx:159:10: fatal error: 'jni.h' file not found
#include <jni.h>
         ^
1 error generated.
make: *** [all] Error 1
```

**jni.h**が見つからないとのことです。どうやら、Makefileをいじってやって、自分の環境に合わせてやらないといけないみたいです。
同じディレクトリ内のMakefileというファイルをお好きなテキストエディタで開き、6行目付近の**INCLUDE=・・・**の部分を以下のように書き換えてください。

```mf
INCLUDE=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
```

Xcode内のファイルを読みに行ってますので、Xcode.appがアプリケーションフォルダ以外の場所にある場合は、適宜上記を読み替えてください。

他のページでもこの部分を書き換えたら上手くいきましたという報告は多々あるのですが、それらのページに書かれているパスを実際に見てもjni.hは存在せず。。。
英語で書かれたページを見ると、同じような現象の方がいるようで、そちらを参考にしました。

書き換えた後は、同じようにmakeしてみます。

```bash
sudo make
```

すると、正常にmakeされ、ディレクトリ内に**MeCab.jar**などが作られます。(<font color="Red">警告(Warning)が大量に出ますが、問題ありません</font>)
ディレクトリ名を**mecab-java-0.996**から**mecab-java**に変更し、**/usr/local/bin/**にコピーしてください。つまり、**MeCab.jar**の位置が**/usr/local/bin/mecab-java/MeCab.jar**となります。

#エイリアスを作る

ターミナル上でjavaのコンパイルをする場合は、これを行うことで、毎回コンパイルするときにクラスパスを書く必要が無くなります。

まず、テキストエディタで**~/.bash_profile**を開いてください。無い場合は新規作成してください。そして下記の内容が書かれていない場合は追記します。

```bash
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

続いて、テキストエディタで**~/.bashrc**を開いてください。無い場合は新規作成してください。以下の内容を追記します。

```bash
alias mecajavac='env DYLD_LIBRARY_PATH=".:/usr/local/bin/mecab-java" CLASSPATH=".:$CLASSPATH:/usr/local/bin/mecab-java/MeCab.jar" javac'
alias mecajava='env DYLD_LIBRARY_PATH=".:/usr/local/bin/mecab-java" CLASSPATH=".:$CLASSPATH:/usr/local/bin/mecab-java/MeCab.jar" java'
```

これでパスを通すことができます。今後ターミナル上でコンパイルするときは**mecajavac**、実行するときは**mecajava**コマンドで行うことができます。しかし、El CapitanではコンパイルしようとしてもMeCabが見つからないとかでエラーが出る場合があります。その場合は、この後の「SIPを無効化する」節を試してみてください。

##mecajava及びmecajavacが使えるかどうかテストする

これで、**mecajavac**及び**mecajava**コマンドを使用することができるようになります。試しに、mecab-java内に入っているtest.javaをコンパイルして実行してみてください。

```bash
mecajavac test.java
mecajava test
0.996
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎	名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

・・・
```

このような結果となったら、成功です。
もし、コンパイルできない場合は、いったんターミナルの再起動をしてみてください。

#SIPを無効化する

もし、この時点でコンパイルできない場合は、以下の手順を試みてください。
ここが二つ目のネックとなりました。
Mac OS X El Capitanからの新機能であるSystem Integrity Protection (SIP)が有効になっていると、せっかくパスを通しても有効にならないようです。厄介な機能ですね。。。
以下の手順で無効化できます。

1. Macをリカバリモードで再起動します。**command + r**を押しながら再起動することでリカバリモードとなります。
2. 画面上部のメニューから**ユーティリティ** -> **ターミナル**でターミナルを開いてください。
3. 以下のコマンドを実行してください。

```bash
csrutil disable
```

これでもう一度Macを再起動してください。SIPが無効化されています。なお、一応SIPを無効化したことによってセキュリティ的には弱くなりましたのでご注意ください。

#Eclipseでの設定

EclipseでMeCabを使用する場合は次の２つの設定が必要です。

####MeCab.jarの追加

新規にJavaプロジェクトを作成するときは、ライブラリーの設定画面で**外部Jar追加...**をクリックして、**/usr/local/bin/mecab-java/MeCab.jar**を追加してください。
![新規Javaプロジェクト設定画面](https://qiita-image-store.s3.amazonaws.com/0/84550/77b643e8-847d-1044-66b6-5b82fe6c1cab.png)

すでに存在するJavaプロジェクトに追加する場合は、プロジェクトのプロパティを開き、**Javaのビルド・パス** -> **ライブラリー**の画面を開きます。そして同じように、**外部Jar追加...**をクリックして、**/usr/local/bin/mecab-java/MeCab.jar**を追加してください。
![プロジェクトのプロパティ画面](https://qiita-image-store.s3.amazonaws.com/0/84550/5e3b56cc-7242-456c-254a-32d9c8e7ea37.png)

####環境変数の追加

メニューバーから**実行** -> **実行構成** を開きます。
![実行構成画面を開く](https://qiita-image-store.s3.amazonaws.com/0/84550/f922d197-191d-920a-8f86-8341e2d78a96.png)

**環境**タブを開き、**新規**をクリックして新しく環境変数を追加します。
* 名前：DYLD_LIBRARY_PATH
* 値：/usr/local/bin/mecab-java
![実行構成画面](https://qiita-image-store.s3.amazonaws.com/0/84550/7c1bb1bc-331b-aa82-b0e2-ce27acd82cbe.png)

これで設定完了です。MeCabが使用できるようになるはずです。

#補足1）エラーが出る場合
以上までの流れを終えて、eclipseで実行した際にエラーが出る場合、以下の点を確認してください。
/usr/local/bin/mecab-javaに移動してください。

```bash
cd /usr/local/bin/mecab-java/
```

ファイルの一覧を確認して、libMeCab.dylibファイルがあるかを確認してください。もし、ファイル名がlibMeCab.soになっている場合は、拡張子を変更してlibMeCab.dylibにしてください。

```bash
mv libMeCab.so libMeCab.dylib
```


#補足2）実際にコード内で使用するとき
直接この記事とは関係ありませんが、MeCabを使用する際にはソース内で初めにMeCabをロードしておかないと正常に使用できないようです。私はこの部分もまともに書けていなかったため、ハマってしまいました。
例えば以下のように書きます。

```java
import org.chasen.mecab.*;

public class test {
  static {
    try {
       System.loadLibrary("MeCab"); //ここでMeCabをロード
    } catch (UnsatisfiedLinkError e) {
       System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e); //正常にMeCabをロードできなかった時
       System.exit(1);
    }
  }
  /***以下ソース本文***/
}
```

#参考にしたページ
* [MacでMeCabのJavaバインドを使用する](http://tseiya.hatenablog.com/entry/2012/02/14/154150)
* [Error installing pyjnius, “jni.h” not found. (OS X 10.10.1)](http://stackoverflow.com/questions/27498857/error-installing-pyjnius-jni-h-not-found-os-x-10-10-1)
* [Mac OS X El CapiptanでSIPを無効化する - Qiita](http://qiita.com/zaburo/items/c650cda45c858fe856a9)