🍃

[Spring Boot]組込みじゃないTomcatでSpring BootのWebAppを起動

2022/05/24に公開

◆概要

STSで作成された、「Hello World!」と表示する
「Springスターター・プロジェクト(Spring Initializer)」を
STS上で作成した,組み込みではないTomcatで起動すること

◆本記事のゴール

STS上で作成した,組み込みではないTomcatで起動しています。

そのサーバーに「Springスターター・プロジェクト(Spring Initializer)」が追加されている。

ブラウザ上で「Hello World!」と表示される

◆前提条件

STSで、「Springスターター・プロジェクト(Spring Initializer)」を作成し、
組み込みのTomcatで起動。「Hello World!」が表示される状態。

そこまでの方法は、
下記の記事を参考にして下さい。

下記、記事の所要時間は、
STS4がインストールされていれば、15分程度が目安。

[Spring]SpringBootで簡単なWebApp作成「Hello World!」

◆実行環境

・MacOS(BigSur ver 11.4)
・STS4(Spring Tool Suit4)
・Java(ver 11)
・Tomcat(ver 8.5.78)⇨本記事内でインストール方法紹介

◆手順

①SpringBootServletInitializerのサブクラスを作成する

まず、作成したプロジェクトの、
プロジェクトエクスプローラーを確認すると、
下記のように、表示されていました。

つまり、「web.xmlファイルが存在しない」ことから、
このままでは、正常に起動できません。
そこで、Servlet起動時の設定情報を付与する必要があります。

ただ、「web.xmlファイル」を作成するわけではありません。
「SpringBootServletInitializerのサブクラス」を作成します。
「SpringBootServletInitializerのサブクラス」については、
下記の資料からある程度は、理解できそうです。

SpringBootServletInitializer (Spring Boot 2.7.0 API)

こちらの説明によると、
「An opinionated WebApplicationInitializer to run a SpringApplication from a traditional WAR deployment. Binds Servlet, Filter and ServletContextInitializer beans from the application context to the server.」

つまり、作成されるwarファイルを従来のコンテナに配置できるように
バインドしてくれるクラスのようです。

そこで、前回の記事では特に触れることがなかった、
「DemoApplication.java」に変更を加えます。

まず、src/main/java/com/example/demoの中にある、DemoApplication.javaを開きます。
「SpringBootServletInitializer」と「SpringApplicationBuilder」
に関するframeworkをimportします。

次に、Demo1Applicationのクラスを書き換えます。
「SpringBootServletInitializer」を継承します。
そして、configureメソッドをオーバライドしましょう。

ソースコードは、
下記です。

DemoApplication.java (変更前)
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo1Application {

	public static void main(String[] args) {
		SpringApplication.run(Demo1Application.class, args);
	}

}
DemoApplication.java (変更後)
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.boot.builder.SpringApplicationBuilder;




@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer  {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
        

	}
}

②Tomcatのサーバーを作成、プロジェクトを追加する

・サーバーの作成

[Spring]SpringMVCで簡単なWebApp作成「Hello World!」
「手順:①サーバーの構築(Tomcat)
・Tomcatをダウンロード
・STS4のサーバーの設定
・サーバーの作成」

を参考にしてください。

・「プロジェクト・ファセット」の設定変更

プロジェクトを右クリックして、
プロパティを開きます。そして、「プロジェクト・ファセット」を開きます。
「ファセットフォームへ変換...」を押します。

すると、
下記のように表示が変わるので、
「Java」と「動的Webモジュール」にチェックを入れ、
バージョンを合わせます。
この設定ができたら、適応を押して閉じます。

・サーバーにプロジェクトの追加

サーバーを右クリックして、
「プロジェクトの追加と除去」を押します。

springBootのプロジェクト(今回はdemo)を選択して、
追加します。追加したら、完了を押して閉じます。

※この時、
プロジェクト・ファセット」の設定で、
「動的Webモジュール」にチェックを入れていない場合、
プロジェクトが表示されません。

サーバーの起動、ブラウザでアクセス

・デプロイメント・アセンブリーでのMavenの依存解決設定

Warningで、以下のようなメッセージが表示されるのですが、

このままでは、サーバーの起動しても恐らく下記のエラーがでて、失敗します。

エラー文
org.apache.catalina.core.StandardContext listenerStart
重大: 前のエラーのためにアプリケーションリスナのインストールをスキップします

ですので、
デプロイメント・アセンブリーでのMavenの依存解決を設定することで、
Warnigを解消します。

プロジェクトを右クリックし、設定画面を開きます。
「デプロイメント・アセンブリー」を開きます。
追加ボタンを押します。

「Java ビルドパス エントリー」を選択し、次へ進み、
「Mavaenの依存関係」を選択しましょう。

すると、
「デプロイメント・アセンブリー」に、「Mavaenの依存関係」が追加されます。

これで、
Warningが解消されれます。

※STS4の場合、
「Eclipse Enterprise Java and Web Developer Tools」(WDT)というプラグインを入れていないと、「デプロイメント・アセンブリー」で追加ボタンを押しても、
「Java ビルドパス エントリー」が表示されません。

なので、WDTを入れてください。
WDTの入れ方がわからない場合は、下記記事の

[Spring]SpringMVCで簡単なWebApp作成「Hello World!」
「手順:⓪STS4の設定:アプリケーション開発のため
・WTPプラグインのインストール」

を参考にしてください。

・サーバーの起動

それでは、サーバーを起動させましょう。

埋め込みじゃないTomcatから起動しても、
コンソールには、Springと表示されるようですね。

・ブラウザからアクセス

それでは、仕上げです。

http://localhost:8080/demo/

にブラウザからアクセスしましょう。

さて、
上記のように表示されたでしょうか。

これで、
STS上から埋め込みではないTomcatで起動できました。
発展すると、STS上ではない完全に外部のTomcatから起動するということもやれます。
そうすれば、作成したWebAppを外部に公開することもできますね。

以上です。
ありがとうございました。
それでは!

参考

・Spring BootアプリをTomcatにデプロイする

・SpringBoot外部TomcatへWarパッケージを展開する方法

Discussion