こんにちは、うえだです。
業務でJenkinsやGradleを組み合わせて利用したところ、とても便利だったので、紹介させていただきたいと思い記事を書きました。多少前提知識が必要だったり、所々、詳細を省いた説明となっていますがご了承ください。
はじめに
今回は、以下が完了しているものとして説明します。
- JDKインストール済み
- Pleiades 4.7 Oxygenをインストール済み
http://mergedoc.osdn.jp/ - Jenkinsをインストール済み(最新バージョン2.138.3を使用)
https://jenkins.io/download/
目的
Gradleを使う目的は、Webアプリケーション開発における一定の作業を自動化して、開発効率を高める事です。
今回はGradleを使用した例を1つ、紹介いたします。
開発環境
- インターネット接続が可能である事
- 開発対象アプリケーション: Tomcat上で動作するサーブレット + JSP
- 開発・動作環境
- OS: Windows10 64bit
- IDE: Pleiades 4.7 Oxygen
- Java: JDK 8u172
GradleによるWebアプリケーションプロジェクトの作成
Gradleプロジェクトの作成
Eclipseでプロジェクトを作成しますが、今回は「Gradleプロジェクト」で作成します。
PleadesのEclipseには初めからGradleプラグインがインストールされているため、すぐに作成できます。
新規Gradleプロジェクトウィンドウで次の操作をします。
- プロジェクト名にgradle-sampeと入力して次へ
- GradleディストリビューションにGradleラッパーを選択して次へ
- プロジェクトの作成が開始される
warファイルを作成しサーブレットを動かす
まず、作成したプロジェクトフォルダの gradle/wrapper/gradle-wrapper.properties を開きます。
下記部分が4.10である事を確認します。それ以外であれば書き換えて保存します。
1
|
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip
|
プロジェクトフォルダ直下のbuild.gradleを開き、以下のように変更します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// Gradleプラグインの宣言
apply {
plugin 'java-library'
plugin 'war'
}
// Gradleがアプリケーション依存ファイルを取得する際に参照するリポジトリ
repositories {
jcenter()
}
// 依存ファイルを記述: アプリケーションに足りないライブラリはこちらに追記
dependencies {
implementation 'org.apache.tomcat:tomcat-catalina:9.0.7'
}
|
サーブレットは下記の通りです。
1
2
3
4
5
6
7
8
|
@WebServlet("/hello")
public class SampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain;charset=utf-8");
response.getWriter().print("Hello World!");
}
}
|
build.gradleとサーブレットを用意したらwarを作成してアプリケーションを動作させてみます。
- Gradleのwarタスクを実行します。
- Eclipseメニューから実行 > 実行構成 > Gradleプロジェクト で右クリックし「新規」
- 以下を入力し、実行
- 実行名: gradle-sample war
- タスク: war
- warファイルをTomcatに配備します。
- Eclipseプロジェクトのbuild/libsフォルダを開くと
gradle-sampe.war
ファイルが作成されています。 /tomcat/9
(以下)直下のwebapps
にコピー
- Eclipseプロジェクトのbuild/libsフォルダを開くと
- Tomcatを起動します。
/bin/startup.bat
を実行
- Tomcatが動作している事を確認し、
http://localhost:8080/gradle-sample/hello
をブラウザで開きます。
タスクの実行
ツールバーの実行ボタンの右にある▽をクリックし、リストから「war」を選択します。
Gradle実行のタブに実行リストが表示されます。これが全て緑色であればタスクは正常終了です。
これで、warファイルを作成してアプリケーションを動作させるところまで確認できました。
デプロイのタスク化
先ほど行った「warを作成し」「Tomcatにコピーし」「Tomcatを再起動」の手順をソースファイル修正の度に行うのは面倒です。そこでこの作業をGradleで記述し、ワンクリックで実行できるようにします。
build.gradleにデプロイに必要なタスクを追加します。タスク名は一例です。
なお、build.gradleファイルはGroovy言語で記述します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def getTomcatHome() {
String d = System.getProperty('tomcat.home')
return d == null ? '' : d;
}
def cmdTomcatBat(batFile) {
ProcessBuilder pb = new ProcessBuilder('cmd', '/C', batFile)
if (getTomcatHome() != '') {
pb.directory(file(getTomcatHome() + '/bin'))
pb.start()
}
}
task copyWar(type: Copy, dependsOn: war) {
from 'build/libs'
include 'gradle-sample.war'
into getTomcatHome() + '/webapps'
}
task shutdown() {
cmdTomcatBat('shutdown.bat')
}
task start() {
cmdTomcatBat('startup.bat')
}
|
追加した要素は下記の通りです。
- warファイルを作成しTomcatにコピーする: copyWarタスク
- Tomcatを再起動する: shutdown, startタスク
warファイルを作成しTomcatにコピーする
copyWarタスクは以下を実行します。
- warタスクを実行(warを作成)
- プロジェクトのbuild/libs/gradle-sample.warをTomcatのwebappsディレクトリにコピー
dependsOn指定で前提タスクを実施しているところがポイントです。type: Copy
は、ファイルコピーを行うタスクに指定します。dependsOn: war
は、このタスクを実行する前にwarタスクを実行する指定です。
Tomcatを再起動する
ProcessBuilderを使用してバッチコマンドを実行しています。
Tomcatディレクトリの取得は、Gradleコマンドの引数として渡されたものを読み込むようにします。これは後述のサーバー側におけるデプロイで同じタスクを使用するためです。
タスクの実行
これらをwarタスクと同じ様に実行します。
- Eclipseメニューから実行 > 実行構成 > Gradleプロジェクト で右クリックし「新規」
- 以下を入力し、実行
- 実行名: gradle-sample deployWar
- タスク: copyWar shutdown start
- タスク名は半角スペースまたは改行で区切ります。
- プログラムの引数: -Dtomcat.home=
これでtomcat.home
がシステムプロパティとしてGradle実行中に参照できます。環境によって異なる値を扱いたい場合に、これらのオプションが利用できます。
実行するとGradle実行タブに以下のように表示され、Webアプリケーションも再起動されている事が確認できます(アプリケーションはhelloのメッセージを変える等してお試し下さい)。
今回はGradleでのタスクの作成を紹介しました。
次回はJenkinsで、今回作成したGradleタスクを実行してみようと思います。
補足事項
Gradleタスクの共有
作成したGradleタスクは、以下のファイルがあれば、Javaが動作する他の環境でも実行可能です。
- /build.gradle
- /gradlew.bat
- /gradlew
- /gradle/wrapper/gradle-wrapper.jar
- /gradle/wrapper/gradle-wrapper.properties
Git等でこれらのファイルを共有する事により、開発用サーバーや、他の開発PCでも同様のタスクを実行出来るので、デプロイだけでなく様々なタスクを共有する事で、チーム開発の作業効率を向上出来ます。