GradleとTomcatを使ったJava Servletアプリのデプロイ方法

EclipseなどのIDEは使わずCLIのみでHello Worldアプリのデプロイまでおこなった。備忘録。

# 確認済み環境
- Mac OS
- OpenJDK 17.0.12
- Gradle 8.10
- Tomcat 10.1.28

# 手順

1. ディレクトリ作成

    ```bash
    $ mkdir HelloWorldServlet && cd HelloWorldServlet
    ```

2. Terminalで`gradle init`を実行。実行後聞かれる設定は以下。
    - Select type of build to generate: 1. Application
    - Select implementation language: 1. Java
    - target Java version: 17
    - Project name: HelloWorldServlet
    - Select application structure: 1. Single application project
    - Select build script DSL: 2. Groovy
    - Select test framework: 4. JUnit Jupiter
    - Generate build using new APIs and behavior?: no

3. 以下のファイルを作成。

    ```java: ./app/src/main/java/org/example/HelloWorldServlet.java
    package org.example;

    import java.io.IOException;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @WebServlet("/hello")
    public class HelloWorldServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().println("<h1>Hello, World!</h1>");
        }
    }
    ```
4. `./app/build.gradle`を編集

    ```: ./app/build.gradle
    plugins {
        id 'war'
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0'
        providedRuntime 'org.apache.tomcat:tomcat:10.1.28'
    }
    
    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(17)
        }
    }
    
    tasks.named('war') {
        archiveFileName = 'helloworld.war'
    }
    ```
    
5. `web.xmlを作成`

    ```xml: ./app/src/main/webapp/WEB-INF/web.xml
    <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                                 https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
             version="6.0">
    </web-app>
    ```
6. ディレクトリ構造は以下のようになっていればOK。

    ```bash
    $ tree .
    .
    ├── app
    │  ├── build.gradle
    │  └── src
    │     ├── main
    │     │  ├── java
    │     │  │  └── org
    │     │  │     └── example
    │     │  │        └── HelloWorldServlet.java
    │     │  └── resources
    │     └── webapp
    │     │  └── WEB-INF
    │     │     └── web.xml
    │     └── test
    │        ├── java
    │        │  └── org
    │        │     └── example
    │        │        └── AppTest.java
    │        └── resources
    ├── gradle
    │  ├── libs.versions.toml
    │  └── wrapper
    │     ├── gradle-wrapper.jar
    │     └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── README.md
    └── settings.gradle
    ```

7. gradleでビルドする。今回は`-x test`を付けてテストをスキップする。

    ```bash
    $ gradle build -x test
    ```

8. warファイルができるので、それをデプロイしてtomcatを起動。その後`http://localhost:8080/helloworld/hello`にアクセスするとHello World!が表示される。

    ```bash
    $ cp ./app/build/libs/helloworld.war /usr/local/Cellar/tomcat/10.1.28/libexec/webapps/
    $ catalina start
    $ open http://localhost:8080/helloworld/hello
    ```