IntelliJ Community で Tomcat の実行環境を整備する

# IntelliJ Community で Tomcat の実行環境を整備する
注意：この記事は IntelliJ Community (無料版) で Tomcat (JavaEE) のプロジェクトを作成するためのものです。
Ultimate (有料版) をご利用の方は以下のサイトなどをご利用ください。
また、環境はWindows10を想定しています。

* [[Windows][IntelliJ][Java][Tomcat] IntelliJでTomcat9の環境を作成する](https://qiita.com/tosite0345/items/1ec6919dded8cb24f872#jdk%E3%81%AE%E9%81%B8%E6%8A%9E)

## IntelliJ のインストール
申し訳ありませんが、[IntelliJ](https://www.jetbrains.com/idea/download/)本体のインストールは無限に解説されていると思うので省略します。
なお、自分で解説サイトを探すのが面倒だという方は以下のリンクを参考にするといいと思います。

* [IntelliJ IDEAとは - Weblio辞書](https://www.weblio.jp/content/IntelliJ+IDEA)
* [1から始めるIntelliJ](https://qiita.com/tosite0345/items/1ec6919dded8cb24f872)

## Tomcat のインストール
[Tomcat](http://tomcat.apache.org/)は特に開発には必要ありませんが、サーバーとして機能させるならインストールしておいて損はないでしょう。
なお、解説は以下のサイトにお任せします。

* [Tomcatとは - IT用語辞典](http://e-words.jp/w/Tomcat.html)
* [tomcatインストール](https://qiita.com/Nobuo/items/e11101edd5b5c43d5297)

## プロジェクトの作成
IntelliJを起動したら、新しいプロジェクトの作成をクリックします。
左側のプロジェクトの種類選択からGradleを選択します。
[先ほどのサイト](https://qiita.com/tosite0345/items/1ec6919dded8cb24f872#jdk%E3%81%AE%E9%81%B8%E6%8A%9E)で紹介されている通り、JDKのバージョンを指定します。
次へを選択し、アーティファクトIDにプロジェクト名を入力します。
バージョンはとりあえずそのままでいいでしょう。
次へを選択し、自動インポートにチェックを入れて先へ進みましょう。
完了を押して修了です。

## 設定のいろいろ
IntelliJの設定は、ファイル→設定から開くことができます。

### ソースディレクトリの自動生成
ビルド、実行、デプロイ→ビルド・ツール→Gradle の自動的に空のコンテンツ・ルートのディレクトリーを作成する
にチェックを入れることで、自動でソースディレクトリが作成されるようになります。

### javadoc のホバー表示を有効化
エディター→一般 の中にあるその他の中の、マウス移動でクイック・ドキュメントを表示するにチェックを入れます。
これにより、Eclipseのようにカーソルを当てるだけでそのコードの情報(javadoc)を表示することが出来るようになります。

* [IntelliJ IDEA - マウスオーバーでjavadocをポップアップ表示する](https://blog.y-yuki.net/entry/2016/12/11/000000)

### プライグインのインストール
設定のプライグインからプライグインを導入することが出来ます。
コードの成形プライグインである [google-java-format](https://plugins.jetbrains.com/plugin/8527-google-java-format) とコードのフォーマットチェックプライグインである [CheckStyle-IDEA](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea) の導入をお勧めします。

## build.gradle の設定
プロジェクトフォルダの直下に build.gradle というファイルがありますので、それを開きます。
ソース付きのディストリビューションを使用できるように Gradle ラッパーを構成できます。これは、 IDE にGradle API/DSL のドキュメントを提供します。
と表示されるので、OK、提案を適用！を選択するといいと思います。(よく分かってない)
<br>
さて、ここからは、このプロジェクトでTomcatアプリケーションを作成するための設定をしていきましょう。
.gradleファイルについては以下を参照ください。

* [Gradle初心者によるGradle事始め](https://qiita.com/navekazu/items/af886fa200be8a683132#gradle%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fjava%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89)

また、 Groovy (.gradleファイルに記述しているスクリプト形式) の文法については、以下を参考にしてください。

* [Groovyを知らない人のためのbuild.gradle読み書き入門](https://qiita.com/opengl-8080/items/a0bb31fb20cb6505188b)

まず、以下のようなコードが生成されているはずです。

```groovy
plugins {
    id 'java'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
```

### プライグインの追加

ここの、pluginsにidを追加します。

```groovy
plugins {
    id 'java'
    //プロジェクトをwar化できるようにするプライグイン
    id 'war'
    //Tomcatを1クリックで起動できるプライグイン
    id "org.akhikhl.gretty" version "2.0.0"
}
```

ちなみにwarファイルとそれぞれのプライグインについては以下を参照してください。

* [JAR,WAR,EARそれぞれの違いについて - Java習得を目指すブログ](http://d.hatena.ne.jp/java-wizard/20140311/1394538929)
* [第26章 War プラグイン](http://gradle.monochromeroad.com/docs/userguide/war_plugin.html)
* [gradleからtomcatやjettyを起動する。](https://qiita.com/nisin/items/782d6fe1ef7e94c456a4)
* [akhikhl/gretty](https://github.com/akhikhl/gretty)

### コンパイル時のみに利用するAPI追加

実行環境では用意されていますが、 JavaEE のAPIが無ければサーバープログラムをコンパイルすることはできません。
そこで、dependenciesでコンパイル時のみに参照するライブラリを指定します。

```groovy
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    //コンパイル時のみに利用するライブラリを指定。
    compileOnly 'javax:javaee-api:8.0'
}
```

* [Maven Repository: javax » javaee-api](https://mvnrepository.com/artifact/javax/javaee-api)

### サーバーのバージョン指定

grettyというプライグインでは、 [Jetty](https://www.eclipse.org/jetty/) と [Tomcat](http://tomcat.apache.org/) という2種類のサーバーを起動することができます。
実際に利用する場合は、以下のコードを追加してください。

```groovy
gretty {
    //ここで、Jetty/Tomcatとバージョンを指定する。
    servletContainer = 'tomcat8'
}
```

なお、ServletContainerで指定できるバージョンは、[コチラ](https://qiita.com/nisin/items/782d6fe1ef7e94c456a4)のサイトを参考にしてください。

### 生成するwarファイル名指定

次に、warプライグインで生成するwarファイルのファイル名を指定します。
別に特に指定する必要があるわけではないので、必要ない方は飛ばしてください。

```groovy
war {
    archiveName = 'Hoge.war'
}
```

### 文字コード指定
コンパイル時の文字コードを変更する場合、以下の2文を追加します。

```groovy
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
```

ここではUTF-8を指定しています。
ただ、このままでは通信や外部ファイルの読み込み時に文字化けを起こしてしまうことがるので、
実行時の文字コードも変更しておきます。
gettyの内部に以下のように追加します。

```groovy
gretty {
    servletContainer = 'tomcat8'
    jvmArgs = ['-Dfile.encoding=UTF-8']
}
```

jvmArgsに指定した文字列が、java実行時にオプションとして追加されます。

これで、設定ファイルの編集は終了です。
纏めたものを以下に示します。

```groovy
plugins {
    id 'java'
    id 'war'
    id "org.akhikhl.gretty" version "2.0.0"
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compileOnly 'javax:javaee-api:8.0'
}

compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'

gretty {
    servletContainer = 'tomcat8'
    jvmArgs = ['-Dfile.encoding=UTF-8']
}

war {
    archiveName = 'Hoge.war'
}

```

## 実行方法
表示→ツールウィンドウ→Gradle を選択すると、Gradleのタスクリスト？のようなものが出てきます。
その中のTasks→gretty→tomcatRunをダブルクリックでTomcatを起動することが出来ます。
これで起動すると、右上の実行ボタンでも操作が出来るようになります。
後々からも呼び出せるように、▷マークの左側にあるドロップダウンから、プロジェクト名[tomcatRun]の保存を行いましょう。
[]の中が別の物だった場合、1度tomcatRunを実行してから再度行いましょう。

## オマケ (war生成)
Tasks内のbuildにwarというタスクがあるので、それを実行するとwarプロジェクトをwarファイルとして出力してくれます。
具体的には、生成されるbuildというフォルダにclassファイルなどが格納されており、build内のlibsにwarファイルが置かれています。

warファイルは、Tomcatインストールディレクトリ内のwebapps内に置くことで、Tomcat実行時に http://IP:Port/warファイル名 で参照できるようになります。

## 追記(Tomcat9が使えるgrettyを導入)
上記手順で入手したgettyはTomcat8までのバージョンしか利用できなかったので、Tomcat9が使えるものを探しました。

・ [gretty-gradle-plugin](https://github.com/gretty-gradle-plugin/gretty) (GitHub)
・ [Gretty documentation](https://gretty-gradle-plugin.github.io/gretty-doc/index.html) (公式サイト)

plaginsからorg.akhikhl.gretty を削除し、以下の文を追加します。

```groovy
apply from: 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'
```

また、sshが制限されたネットワークなど実行時にgretty.pluginが見つからないといった旨のエラーが出る場合、以下の方法でも実行できます。

```
A problem occurred evaluating root project 'Hoge'.
\> Could not get resource 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'.
   \> Could not HEAD 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'.
      > Connect to raw.github.com:443 [raw.github.com/151.101.72.133] failed: Connection timed out: connect
```
(エラー文)

まず、エラー文にも出ている、[gretty.plugin](https://raw.githubusercontent.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin)をダウンロードします。
それをbuild.gradleと同様のディレクトリに置いた後、先程追加したapply fromの代わりに以下のように設定します。

```groovy
apply from: 'gretty.plugin'
```

# 追記(pluginsで指定できるようになってた)

以下のようにpluginsでidを指定するだけで実行できるようになってました。

```groovy:build.gradle
plugins {
    id 'java'
    id "org.gretty" version "2.3.0"
}
```

# JavaEE開発で役に立ちそうな他記事

+ Cannot cast object エラーが出た
    * [突然Tomcat Runが動かなくなった](https://qiita.com/Kakky/items/a38457b237504e984a53)
    
+ データベース連携
    * [GradleでJOOQを使ってみた](https://qiita.com/Kakky/items/4635ae4303eb0965d935)

+ WebSocketでクライアント開発
    * [[Java EE] WebSocketでClientを実装](https://qiita.com/Kakky/items/2b62dfbf5e5a0027a885)
    
+ ログ保存
    * [JavaEEサーバーでLog4j2を使ってみた](https://qiita.com/Kakky/items/83e6f3e1c876324509b2)