[備忘録!]GradleでWARを作る


#1. はじめに
「簡単なServlet（HelloServlet的な）を持ったWARをGradleで作ってTomcatで動かしてみる。」という備忘録。
最初にことわっておきますと結構雑、且つ、必須ではない？ような手順が少し混ざっているかもしれません。
が、行った作業の備忘録という性質上ご容赦いただければありがたく思います。

* 本稿範囲：
 * Gradleを使ってEclipseプロジェクトを作り
 * そのプロジェクトをimportしてEclipseでコーディングし
 * EclipseのGradle IDEを利用してWARを作り
 * Tomcatへ配布してWEBブラウザからServletが正しく動作する事を確認する
* 対象読者：Gradleの初心者、GradleをWEBアプリ開発に活用したい方
* 開発環境：OS X Mavericks v10.9.4
* Gradle：Ver. 2.0
* Eclipse：Ver. Luna Release (4.4.0)

#2. Gradleのinstall
install、といってもZIPファイルを解凍して中に入っているbinディレクトリにPATHを通すだけの簡単なお仕事です。
[こちらのサイト](http://www.gradle.org)から、ZIPをDownloadしてきましょう。
`.bash_profile`のPATHの末尾にZIPを解凍して現れたbinへのパスを追加します。
うまくインストールできたか、以下のコマンドで確認します。

```ターミナル
$ gradle -v

------------------------------------------------------------
Gradle 2.0
------------------------------------------------------------

Build time:   2014-07-01 07:45:34 UTC
Build number: none
Revision:     b6ead6fa452dfdadec484059191eb641d817226c

Groovy:       2.3.3
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_45 (Oracle Corporation 24.45-b08)
OS:           Mac OS X 10.9.4 x86_64
```

#3. Eclipseのinstall
[こちらのサイト](https://www.eclipse.org)からEclipseのDownloadをします。
今回は、「Eclipse Standard 4.4」をダウンロードしました。tarを解凍すれば終了です。

次にGradle IDEをインストールします。
Eclipseのメニュー「Help => Install New Software」を開きます。

「http://dist.springsource.com/release/TOOLS/update/3.6.0.RELEASE/e4.2/」からGradle IDEをinstallします。
これをinstallすることで、Eclipse上からGradleを実行することが出来るようになります。

![available_software.png](https://qiita-image-store.s3.amazonaws.com/0/43853/b65dc853-8ee6-164f-3a3f-804f7a2c0fbe.png "available_software.png")

あとはWTP関連のプラグインもinstallしましたが必要ないかもしれません？
![availabels_software_2.png](https://qiita-image-store.s3.amazonaws.com/0/43853/dc251006-a5d9-c01e-23db-997c1b063d94.png "availabels_software_2.png")


#4. Eclipseプロジェクト作成
新しく適当なディレクトリを作成し、そこに`build.gradle`を作ります。
中身はこんな感じになります。

```build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'

version = 1.0

sourceCompatibility = 1.7
targetCompatibility = 1.7

description = 'Sample Project'

ext {
	slf4jVersion = '1.6.6'    # 必須ではない slf4j用
	slf4jGroup = 'org.slf4j'  # 必須ではない slf4j用
}

configurations {
	extraLib
}

repositories {
	mavenCentral()
}

dependencies {
	testCompile 'junit:junit:4.8'    # 必須ではない JUnit用
	compile group:"org.apache.struts", name:"struts2-core", version:"2.3.16.3"    # 必須ではない struts2 core
	extraLib "$slf4jGroup:slf4j-api:$slf4jVersion", "$slf4jGroup:slf4j-simple:$slf4jVersion"  # 必須ではない slf4j
	providedCompile "javax.servlet:javax.servlet-api:3.1.0"
}
```

dependenciesに色々書いていますが、今回必要なのは`providedCompile "javax.servlet:javax.servlet-api:3.1.0"`だけです。
mavenCentralリポジトリから依存するパッケージ達を引張ってくる、という事をやっています。
javaxは、warに含める必要はないので`providedCompile`にしています。

eclipseプラグインは、GradleからEclipse用のプロジェクトを作るプラグインです。
このプラグインが追加する`eclipse`というタスクを実行します。
build.gradleが置いてあるディレクトリで以下のようにコマンドを打ちます。


```ターミナル
$ gradle eclipse
```

すると、.project、.classpath、.settingといったファイルが作られます。隠しファイルなので `ls -a`で、これらのファイルが作られている事を確認します。

#5. プロジェクトの作成
それではEclipseから上の手順で作成したプロジェクトをimportしましょう。
Project Explorerを右クリックして、importです。

![import_1.png](https://qiita-image-store.s3.amazonaws.com/0/43853/de24cd68-b3dc-0068-f4b1-c855252b2acf.png "import_1.png")

先程、プロジェクトファイルを作成したパスをRoot folderに入力し、 Build Modelボタンを押下しましょう。
下にプロジェクトが現れるので選択してfinishボタンを押下します。

![import_2.png](https://qiita-image-store.s3.amazonaws.com/0/43853/1f69a5ae-782b-1192-8fc4-d9cc3c4d1690.png "import_2.png")


importしたプロジェクトを右クリックしてPropertiesを選択します。
メニューからJava Build Pathを選択します。
Gradleのjavaプラグインにはプロジェクトレイアウトという概念があります。
この概念のデフォルト値に則った形でフォルダを作っていきます。

![Java_build_path.png](https://qiita-image-store.s3.amazonaws.com/0/43853/6924a030-af90-f23e-d965-e7bd2da6618c.png "Java_build_path.png")


次にServletを作ります。

```TestServlet.java
package jp.co.resonance;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		PrintWriter out;
		res.setContentType("text/html; charset=UTF-8");
		out = res.getWriter();
		out.println("Hello World!");
	}
}
```

web.xmlも作ります。

```web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
         id="WebApp_ID" 
         version="3.1">
	<display-name>TestDynamicWebApp31</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	    <welcome-file>index.htm</welcome-file>
	    <welcome-file>index.jsp</welcome-file>
	    <welcome-file>default.html</welcome-file>
	    <welcome-file>default.htm</welcome-file>
	    <welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
	    <servlet-name>TestServlet</servlet-name>
	    <servlet-class>jp.co.resonance.TestServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
	    <servlet-name>TestServlet</servlet-name>
	    <url-pattern>/TestServlet/*</url-pattern>
	</servlet-mapping>
</web-app>
```

こんな感じになっていればOKです。
![project_explorer.png](https://qiita-image-store.s3.amazonaws.com/0/43853/ad9de1fd-defd-148c-1586-86e061230c7f.png "project_explorer.png")



#6. WARを作って配置
プロジェクトを右クリックして「Run As => Gradle Build...」を選択します。
warタスクを実行することでwarファイルが作られます。（勿論コンパイルもされます。）

![gradle_build.png](https://qiita-image-store.s3.amazonaws.com/0/43853/c034dd1f-3b72-7e44-b0d6-caa511a47af1.png "gradle_build.png")

build/libsに、warファイルが作られます。これをTomcatへ放り込みます。
（Tomcat環境の構築は割愛します。）

#7. 動作確認
Servletが呼び出されるようにWEBブラウザからリクエストを投げます。
このような質素な画面が出れば成功です。

![hello_world.png](https://qiita-image-store.s3.amazonaws.com/0/43853/bb60482c-0174-6957-52af-a0d3301b236a.png "hello_world.png")



#8. さいごに
Gradleの記事をいくつか探しましたがAndroid Studioで使用するものは多いのですが、EclipseでWEBアプリ開発、というものをあまり見かけませんでした。
「WEBアプリ開発でGradleを使ってみようかな？」という方の一助になれば幸いでございます。
駄記事におつきあいいただきありがとうございます。

##8.1. 参考文献

Gradleに関しては日本語の書籍があまりないので洋書で。（Kindleだと速攻で読めて、且つ、安いのでよいですね。）
* Gradle Effective Implementation Guide - Packt Publishing

あとはドキュメントの日本語訳が非常に充実しているので、こちらを多いに参考にするとよいかと思います。
* [Gradle日本語ドキュメント](http://gradle.monochromeroad.com/docs/)