JSP/ServletアプリケーションをAzure WebApps Tomcatの複数コンテキストにデプロイする

# JSP/ServletアプリケーションをAzure WebApps Tomcatの複数コンテキストにデプロイする

前回は Spring Boot アプリケーション を Azure WebApps にデプロイしたわけですが、そんなモダンなフレームワークなんか使ってない場合も多いと思います。というわけで今回は、世の中で多く稼働しているであろう Tomcat 上で動くJSP/ServletアプリケーションをAzure WebAppsにデプロイするポイントなどを解説します。

Tomcatですので複数のWebアプリケーション (war) をデプロイできます。単純にルートコンテキストにWebアプリケーションをデプロイするのは簡単なのですが、複数のコンテキストにWebアプリケーションをデプロイしようとするとちょっとしたコツが必要なので、そこを解説してみます。

実は2年ほど前にも一度調べていて、以下に備忘録代わりのサンプルを置いてあります。このサンプルはこのままで動きますが、 Maven webapps pluginのバージョンを最新にすると動かなくなります。

[m-moris/azure-java-sample-howto-deploy-webapps: How to deploy webapps with java](https://github.com/m-moris/azure-java-sample-howto-deploy-webapps)

その際にエラーがでるので、それを元にググりまくると解決策がわかるのですが、あとでリンクする文書含めてきちんと説明されてないなという印象です。

# プロジェクトの準備

MavenでシンプルなWebアプリケーションを作成します。index.jsp のみですが、挙動を確認するだけですので、これで十分でしょう。

```sh
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
```

コンテキストパスを表示するようにだけ修正しておきます。

```html
    <body>
        <h1>Hello Azure!!</h1>
        <h2> ContextPath = ${pageContext.request.contextPath} </h2>
    </body>
```

# ルートコンテキストへのデプロイ（なにも設定しない場合）

前回の記事と同じくWebAppの構成をします。ここでは、Linux/Java11/Tomcat9 にします。

```sh
mvn com.microsoft.azure:azure-webapp-maven-plugin:1.13.0:config
```

リージョンを `japaneast`に修正してデプロイします。

```
mvn clean package azure-webapp:deploy
```

ブラウザ確認すると、ルートコンテキストにデプロイされており、 Kudu（※）で確認すると `app.war` が `/home/site/wwwroot` にデプロイされています。ここに `app.war` があると、それがルートコンテキストにデプロイされたことになるようです。

**ブラウザでのアクセス**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/e77c622a-8099-059e-277c-83f746926644.png)

**Kudu**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/26fe9064-3aa6-a8a7-e70a-7c6949a7c78e.png)

**罠ではあるのですが、この状態になると後述する手順で正しくコンテキストパス毎にデプロイしても、正しく動作してくれません。** `/home/site/wwwroot` にある `app.war` が何やら邪魔しているくさい（どういう原理？）。KudoからSSHで`app.war`を消すと正しく動作するので、ここに`app.war`があることがなにやら関係している臭いです。

※ WebAppsの管理コンソール的なもので、ポータルから高度なツールで起動できる。WebAppsが動いているVMの中身を参照できるが、操作はできない。

# 正しくルートコンテキストにデプロイする

実は `<targetPath>` 要素というものがあり、これを指定することで希望するロケーションにデプロイできます。

以下のサンプルのように `<targetPath>` 要素でデプロイ先を指定できるので、`webapps/` 配下に `ROOT.war` にデプロイすればルートコンテキストになります。

```xml
 <build> 
    <finalName>ROOT</finalName>   <!-- ※ -->
    <plugins> 
      <plugin> 
        <groupId>com.microsoft.azure</groupId>  
        <artifactId>azure-webapp-maven-plugin</artifactId>  
        <version>1.13.0</version>  
        <configuration> 
          <schemaVersion>v2</schemaVersion>  
          <subscriptionId>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</subscriptionId>  
          <resourceGroup>sample-jsp-88888</resourceGroup>  
          <appName>sample-jsp-88888</appName>  
          <pricingTier>B2</pricingTier>  
          <region>japaneast</region>  
          <runtime> 
            <os>Linux</os>  
            <javaVersion>Java 11</javaVersion>  
            <webContainer>Tomcat 9.0</webContainer> 
          </runtime>  
          <deployment> 
            <resources> 
              <resource> 
                <directory>${project.basedir}/target</directory>  
                 <targetPath>webapps/${project.build.finalName}</targetPath> <!-- ※ -->
                <includes> 
                  <include>*.war</include> 
                </includes> 
              </resource> 
            </resources> 
          </deployment> 
        </configuration> 
      </plugin> 
    </plugins> 
  </build> 
```

Kuduで参照すると、`webapps/ROOT` に展開されている事が分ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/5ec5ae5a-4ec9-a38a-26fd-64bb4da2602f.png

ブラウザからもアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/c46b3497-df0d-f9cd-0184-eb4c9f10cefa.png)


次に `ROOT` を `<finalName>sample</finalName>`  にでも変更してデプロイしてみましょう。

再びKuduで確認すると `sample`が展開されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/588c81b3-9682-7c7c-0c0e-a2192da2fe27.png)

ブラウザからも正しくアクセスできることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34017/ae92ee4b-bd31-568e-fb8b-84843456bc02.png)


# まとめ

`<targetPath>`を指定すれば正しく複数Webアプリケーションをデプロイできることが確認できました。あまり丁寧に解説しているドキュメントを見たことがないので、はまっている人の一助になればと。

一応、このあたりに記述はあるのですが、ちっさすぎて見逃しちゃいますよねぇ。

* https://docs.microsoft.com/ja-jp/java/api/overview/azure/maven/azure-webapp-maven-plugin/readme?* view=azure-java-stable#resource
* https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details#resource

また、ここにのサンプルにも記述がありますが、Pluginバージョンが古いので注意が必要です。

* https://docs.microsoft.com/ja-jp/java/api/overview/azure/maven/docs/web-app-samples?view=azure-java-stable

# さらに補足

プラットフォームがWindows の場合も同じかと思いますが、昔検証したときは Windows版のTomcatですと、war を展開しない仕様だったり、微妙にLinuxの場合と設定が違ったりもしたのでちょっと注意が必要です。時間があったら、後で確認するかもしれませんが。

ではでは。