Gradleとgradle-tomcat-pluginを使ってローカルでTomcatを起動する

Gradleとgradle-tomcat-pluginを使ってローカルでTomcatを起動する
目次

最近自前でwarファイルをJavaコンテナにデプロイする機会が減って、実行可能なfat-jarをsystemdに管理してもらうことが増えました。 ただ、今回は敢えてローカル環境でGradleを使ってTomcatアプリケーションを動作させる方法を調査しました。

ローカル環境でTomcatを動かそう

最近はもっぱらSpring Bootを使うのですが、とある事情により、素のTomcat上でwarアプリケーションを動作させる必要が出てきました。

ローカル環境で開発を行う上では、IDEもIntelliJを使うようになり、IntelliJにはTomcat pluginも最初からバンドルされていません。

昔使っていたEclipseやSpring Tool Suite にはTomcatのアイコンがあって、それをポチってアプリケーションを起動させていました。懐かしい。

IntelliJにプラグインをインストールするのも方法論としてはアリですが、今回のユースケースのためだけにIDEを拡張するのも嫌なので、別の方法を模索したかったのです。

環境情報

以下の環境にて方法を模索してみます。

  • Gradle 4.8
  • Tomcat 9

gradle-tomcat-plugin を使う

割とすぐに答えが見つかりました。

ビルドツールにGradleを使っている場合には、gradle-tomcat-plugin を使うことで、Gradle経由でTomcatの起動ができそうです。

今回試したサンプルコードは こちら において置くとして、肝心の build.gradle だけ貼り付けておきます。

 1buildscript {
 2    repositories {
 3        mavenCentral()
 4        jcenter()
 5    }
 6    dependencies {
 7        classpath group: 'com.bmuschko', name:'gradle-tomcat-plugin', version:'2.5'
 8    }
 9}
10
11ext {
12    tomcatVersion = '9.0.10'
13}
14
15apply plugin: 'eclipse'
16apply plugin: 'idea'
17apply plugin: 'java'
18apply plugin: 'com.bmuschko.tomcat'
19
20sourceSets {
21    sourceCompatibility = 1.8
22    targetCompatibility = 1.8
23
24    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
25}
26
27repositories {
28    mavenCentral()
29}
30
31dependencies {
32    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
33    providedCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.1'
34    compile group: 'org.apache.taglibs', name: 'taglibs-standard-impl', version: '1.2.5'
35
36    tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}"
37    tomcat "org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.0.M6"
38    tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
39        exclude group: "org.eclipse.jdt.core.compiler", module: "ecj"
40    }
41}
42
43tomcat {
44    httpProtocol = 'org.apache.coyote.http11.Http11Nio2Protocol'
45    ajpProtocol  = 'org.apache.coyote.ajp.AjpNio2Protocol'
46    contextPath = 'soudegesu'
47}

tomcat 9を使うときのみ tomcat-embed-logging-juli のバージョンが tomcat-embed-core と同じにできない所が留意点でしょうか。 まだ、artifactがpublishされていないようですね。

tomcat のブロックにはコンテキストパスをはじめ、様々なTomcatのオプションを指定できます。 ローカルで開発する分には

アプリケーションは ./gradlew で起動できます。

1./gradlew tomcatRun

サンプルアプリケーションが動いているか確認しましょう。問題なさそうですね。

 1curl http://localhost:8080/soudegesu/sample
 2
 3<!DOCTYPE html>
 4<html>
 5<head>
 6<title>Sample</title>
 7</head>
 8<body>
 9Sample !!!
10</body>
11</html>

Tomcatを停止するときは以下でした。

1./gradlew tomcatStop

まとめ

GradleでTomcatを使った開発したいときには gradle-tomcat-plugin を使うと簡単に導入できることがわかりました。 IDEにプラグインを入れると他のJavaプロジェクトを実装する際にも影響が出てしまいますが、 Graldeプラグインとして利用することで影響範囲がプロジェクト内に留められるので魅力的です。

参考にさせていただいたサイト