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
その際にエラーがでるので、それを元にググりまくると解決策がわかるのですが、あとでリンクする文書含めてきちんと説明されてないなという印象です。
プロジェクトの準備
MavenでシンプルなWebアプリケーションを作成します。index.jsp のみですが、挙動を確認するだけですので、これで十分でしょう。
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
コンテキストパスを表示するようにだけ修正しておきます。
<body>
<h1>Hello Azure!!</h1>
<h2> ContextPath = ${pageContext.request.contextPath} </h2>
</body>
ルートコンテキストへのデプロイ(なにも設定しない場合)
前回の記事と同じくWebAppの構成をします。ここでは、Linux/Java11/Tomcat9 にします。
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 があると、それがルートコンテキストにデプロイされたことになるようです。
ブラウザでのアクセス
Kudu
罠ではあるのですが、この状態になると後述する手順で正しくコンテキストパス毎にデプロイしても、正しく動作してくれません。 /home/site/wwwroot にある app.war が何やら邪魔しているくさい(どういう原理?)。KudoからSSHでapp.warを消すと正しく動作するので、ここにapp.warがあることがなにやら関係している臭いです。
※ WebAppsの管理コンソール的なもので、ポータルから高度なツールで起動できる。WebAppsが動いているVMの中身を参照できるが、操作はできない。
正しくルートコンテキストにデプロイする
実は <targetPath> 要素というものがあり、これを指定することで希望するロケーションにデプロイできます。
以下のサンプルのように <targetPath> 要素でデプロイ先を指定できるので、webapps/ 配下に ROOT.war にデプロイすればルートコンテキストになります。
<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 に展開されている事が分ります。




