elasticsearch + IntelliJ 開発環境構築

# elasticsearch開発環境

## はじめに

やりたいこと

> elasticsearchの動作解析(主にMoreLikeThisAPI)をしたい
> 
> ソースコードからビルド、デバッグできる環境を構築したい

eclipseではなく
どうせなら、最近のIDEを使いたい!!
(実は、eclipseがうまく設定できなかった...)

>
> IntelliJ(IDEA)でやってみる
> 

elasticsearch 5.xから maven -> gradleに変更となっています。

## 構築環境

| type | version |
|:-----------|:-----------|
| OS |Mac OSX 10.11.6 (Sierra怖い...)|
| IDE | IntelliJ Community Edition 2016.3 |
| JDK | jdk1.8.0_121.jdk |
| BuildSystem | gradle 2.13 (2.13以外はNG)|
| SDKMAN(旧gvm) | SDKMAN 5.5.4+199 |
updated at 2017.3.15


## 1. JDK

[JDK download](http://www.oracle.com/technetwork/java/javase/downloads)
例) JDK -> MacOS X(jdk-8u121-macosx-x64.dmg)

インストール
ダウンロード後、クリックしてインストールするだけ

## 2. gradle

[事前準備]
#### SDKMAN!

> 旧gvm: gradle バージョン切替可能(pyenvみたいなもの)
>
> 理由:  gradle 2.13にする必要があるため

[Official(sdkman)](http://sdkman.io/install.html)

インストール

```shell-session:terminal
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

$ sdk version   << version確認

<< 以降はコメント
```

インストール画面
<img width="320" alt="sdkman01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/49fd1339-784e-5d63-1dbc-74e0a74cf3d8.png">

う、うーん...カコイイ...
普通にgvmでよいような...

#### gradle

>
> SDKMAN経由でインストールします
>

インストール

```shell-session:terminal
$ sdk list gradle
$ sdk install gradle 2.13

$ gradle --version   << version確認
```

## 3. elasticsearch

>
> githubからソースコードをcloneします
>

git clone & gradle idea

```shell-session:terminal
$ cd <your_project_dir>
$ git clone git@github.com:elastic/elasticsearch.git

$ git branch -a                             << show remote branch
$ git checkout -b 5.2 remotes/origin/5.2    << at 2017.3.15(5.3だとうまくbuildできず or 別にmasterでもよいかと)

$ gradle clean
$ gradle idea                               << intelliJプロジェクトに変換

<< 以降はコメント
```
[github(elasticsearch)](https://github.com/elastic/elasticsearch "github")


## 4. IntelliJ(IDEA)

>
> 統合開発環境(IDE)
>

[Official(inntelliJ)](https://www.jetbrains.com/idea/)

- インストール方法[割愛]
- プロジェクトインポート  

1) 新規

<img width="480" alt="intellij0100.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/f7d53ddf-e92e-25a7-d6d2-fa3038d02500.png">

参考) 起動中からの画面
File -> New -> Project from Existing Sources...

<img width="320" alt="inntelij01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/d58dc501-66dc-9b68-76cb-1ddf2d8edae5.png">
  
2) Gradleを選択
<img width="480" alt="intellij02.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/ea4c08de-dce9-e81a-52c5-a623475c5998.png">

3) ディレクトリを指定

<img width="480" alt="intellij0301.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/56e5ca8c-35b5-bce6-9c5c-8f881b50ee62.png">

※②Gradle homeに関して

初期状態で空欄の状態

ここがわからずにハマった...
下記を実行して出力された値を設定して解決

build.gradle追加(task run下あたりにでも)

```groovy
task getHomeDir << {
    println gradle.gradleHomeDir
}
```

4) gradle実行(terminal)

```shell-session
$gradle getHomeDir
```

下記のような出力がある
ex: ~/.sdkman/candidates/gradle/2.13  

参考サイト
[stackoverflow](http://stackoverflow.com/questions/18495474/how-to-define-gradles-home-in-idea)



## 5. ビルド

プロジェクトビルド
Build -> Build Project

<img width="480" alt="intellij04.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/a1018d2d-4c35-3fc8-5b73-77b92d812b42.png">

Task実行
<img width="480" alt="intellij05.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/342bab37-0133-0598-3c7d-4df2c3f9ac8e.png">

Edit Configuration

<img width="480" alt="intellij.png" src="https://qiita-image-store.s3.amazonaws.com/0/170415/7371afa9-69d8-23ad-3e6b-5dabd5d2953f.png">

起動確認

```shell-session
$ telnet localhost:9200
```

result

```json
{
  "name" : "T3CzGiq",
  "cluster_name" : "distribution_run",
  "cluster_uuid" : "jIpXGYNOTP2dM_3b4XQr4g",
  "version" : {
    "number" : "5.2.3",
    "build_hash" : "3e13dbb",
    "build_date" : "2017-03-15T08:19:26.460Z",
    "build_snapshot" : true,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}
```

## その他(エラー対処)

#### Switch IDE boot JDK..

```

 JDK versionが違うというエラーが出た場合

```
Help -> Find Action -> Switch IDE boot JDK...

自分の場合は brew installしたJDKを指定しました

参考ページ
[引用](https://blog.jetbrains.com/idea/2015/05/intellij-idea-14-1-4-eap-141-1192-is-available/)

#### JAVA_HOME

```
* What went wrong:
A problem occurred evaluating project ':benchmarks'.
> Failed to apply plugin [id 'elasticsearch.build']
   > JAVA_HOME must be set to build Elasticsearch
```

エラー内容: JAVA_HOMEが設定されていない
下記でJAVA_HOMEを設定する( ~/.bash_profileなどとは別なので注意 )

参考ページ
[引用(謝)](http://qiita.com/hoisjp/items/19374252db8e748c3407)

/Library/LaunchAgents/setenv.JAVA_HOME.plist 編集(新規作成)

```xml:setenv.JAVA_HOME.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
  <key>Label</key>
  <string>setenv.JAVA_HOME</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>setenv</string>
    <string>JAVA_HOME</string>
    <string>/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>
```

設定反映

```shell-session
$launchctl load /Library/LaunchAgents/setenv.JAVA_HOME.plist 
```

## デバッグ方法

こちらは後日別途

## おわりに

環境構築面倒くさいですね...
でも、これでようやくデバッグができます！！

不備 & 問題点等あればご指摘ください(初投稿！！)