Kotlin + Gradle で Tomcat 7 の Hello World


この記事は、 大阪工業大学 Advent Calendar 2019 の16日目の記事です。

背景・目的

本業が Android アプリ開発で、趣味が Web アプリケーション開発です。
なので、普段 Android アプリ開発に用いる Kotlin + Gradle を Web アプリケーション開発にも用いたいと考え、 Hello World を作成しました。

つくったもの

GitHub: https://github.com/mizo0203/hello-world-tomcat-kotlin

開発環境

IDE
IntelliJ IDEA 2019.3 (Community Edition)

開発に用いる IDE は IntelliJ IDEA です。

Android アプリ開発用といえば Android Studio が公式の IDE として公開されていますが、 Android Studio は IntelliJ IDEA がベースです。基本的な操作方法は Android Studio と変わりません。

上記、 GitHub 上のリポジトリを Clone or download して、 IntelliJ IDEA から Open できます。 IntelliJ IDEA 2019.3 (Community Edition) にて動作確認済です。

ローカル環境で動作確認

Gradle Tomcat plugin を導入しました。下記コマンドで、ローカル環境に Tomcat サーバを起動できます。

$ ./gradlew tomcatRun

> Task :tomcatRun
Failed to create META-INF directory in classes directory /Users/satoki/GitHub/hello-world-tomcat-kotlin/build/classes/java/main
Started Tomcat Server
The Server is running at http://localhost:8080/hello-world-tomcat-kotlin
<==========---> 80% EXECUTING [18s]
> :tomcatRun

下記コマンドでサーバを停止できます。

$ ./gradlew tomcatStop

BUILD SUCCESSFUL in 614ms
1 actionable task: 1 executed

Address already in use (Bind failed) エラーによってサーバ起動に失敗するならば、 ./gradlew tomcatStop コマンドの実行忘れが考えられます。

$ ./gradlew tomcatRun --stacktrace --info

# 〜省略〜

> Task :tomcatRun FAILED
Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["ajp-bio-8009"]
Started Tomcat Server
The Server is running at http://localhost:8080/hello-world-tomcat-kotlin
Pausing ProtocolHandler ["http-bio-8080"]
Pausing ProtocolHandler ["ajp-bio-8009"]
Stopping service Tomcat
Stopping ProtocolHandler ["http-bio-8080"]
Stopping ProtocolHandler ["ajp-bio-8009"]
Destroying ProtocolHandler ["http-bio-8080"]
Destroying ProtocolHandler ["ajp-bio-8009"]
:tomcatRun (Thread[Execution worker for ':',5,main]) completed. Took 4.563 secs.

FAILURE: Build failed with an exception.

# 〜省略〜

Caused by: org.gradle.api.GradleException: An error occurred starting the Tomcat server.
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

# 〜省略〜

Caused by: java.net.BindException: Address already in use (Bind failed)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

# 〜省略〜

BUILD FAILED in 5s
2 actionable tasks: 1 executed, 1 up-to-date

参考サイト