Spring MVC + Thymeleaf + Gradle で開発環境構築

Spring
Spring

この記事書くだけでもかな~りハマりました。やっぱり環境構築って嫌い。

というわけで、Spring MVC (Bootじゃないよ) + Thymeleaf + Gradle という環境で環境構築をしたので書き残しておきます。
IDEにはEclipseのPleiades All in Oneを使用しました。サーバは同梱されているTomcat9、Javaも同梱されているJava8を使っています。
この記事は、
「Eclipseのインストール」⇒「Gradleプロジェクト作成」⇒「ソース記述」⇒「デプロイ&疎通確認」
の流れで進んでいきます。

導入環境
  • Windows 10 Home 64bit

Eclipseをインストール

Eclipseをダウンロード

Pleiadesのサイトにアクセスし、ダウンロードするPleiadesのバージョンを選択します。
特に理由がなければ、最新バージョン(2021/01/27現在は「Eclipse 2020」)を選択します。

次の画面ではパッケージを選択します。

JavaまたはUltimateいずれかのFull Editionを選択してください。UltimateではJava以外にもC/C++、PHP、Python、Rubyといった言語の開発も可能になります。その分ファイルも大きいです。持て余すなぁと思う方はJavaパッケージで十分だと思います。お好きなほうを選択してください。Zipファイルのダウンロードが開始されます。

# UltimateはZipファイルがおよそ2.3GB、ダウンロードに20~30分くらいかかりました。Javaパッケージもこれくらいのサイズ感だと思います。覚悟ください。

Eclipseをインストール

ダウンロードしたZipファイルを解凍します。解答には7Zip等の解凍ツールを使用することを強く勧めます。ファイルのパスの長さがどうこうっていうエラーが発生する可能性があります。

今回はCドライブ直下にインストールします。7Zipで下記のように指定して解凍します。

Eclipseを起動&ワークスペース設定

解凍が完了したら、「C:\pleiades\eclipse\eclipse.exe」をダブルクリックして起動します。起動直後はコマンドプロンプトが表示されて何やらバッチみたいなのが動いているみたいですが触らず放置です。初回起動であれば1分ほどでワークスペースの選択画面が表示されます。
ワークスペースの場所を任意で選択します。今回は「D:\workspace」に設定しました。

Eclipseの起動が完了しました。

Gradleプロジェクトの作成

プロジェクト作成

パッケージ・エクスプローラーの「新規Gradleプロジェクトを作成します。」をクリックしてGradleプロジェクトの作成ダイアログを表示します。

プロジェクト名を入力します。今回は「hello」としました。設定項目はほかにもありますが、特に変更することがないので「完了」を押下してプロジェクトを作成します。

Gradleプロジェクトが作成され、パッケージ・エクスプローラーにhelloフォルダが表示されます。

プロジェクトのプロパティ設定

プロジェクトのプロパティ変更を行います。プロジェクト名を右クリックして、一番下の「プロパティー」を選択します。

左側のメニューより「プロジェクト・ファセット」を選択します。初期状態では「プロジェクトファセットが構成されていません」という旨のメッセージが表示されているので、その下の「ファセット・フォームへ変換…」というリンクを押下します。

「Java」にチェックがついていることを確認し、バージョンを「1.8」に変更します。
続いて、「動的Webモジュール」にチェックをつけ、バージョンを「3.0」に変更します。
その後、下に「より詳しい構成が使用可能…」というリンクが表示されるので、これを押下します。

コンテンツ・ディレクトリーを「src/main/webapp」に変更します。
続いて、「web.xml デプロイメント記述子の生成」にチェックをつけます。完了したら「OK」を押下します。

前の画面に戻ったら、「適用して閉じる」を押下します。

続いて、もう一度同じ手順でプロパティー設定画面を開き、「デプロイメント・アセンブリー」を開きます。
「/src/test/」配下のクラスはデプロイしないので、2つとも選択して「除去」を押下します。
その後、「追加」ボタンを押下します。

「Java ビルド・パス・エントリー」を選択し、「次へ」を押下します。

「プロジェクトと外部の依存関係」を選択し、「完了」ボタンを押下します。

画像のような状態になったら、「適用して閉じる」を押下します。

プロジェクトのプロパティ設定は以上で終了です。

Springアプリの作成

Gradleの設定

Gradleでモジュールの依存関係を設定します。

プロジェクト直下の「build.gradle」を下記のように編集します。

build.gradle

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
apply plugin: 'eclipse'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    jcenter()
}

dependencies {
    // Spring MVC
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.3.3'
    compile group: 'org.thymeleaf', name: 'thymeleaf-spring4', version: '3.0.12.RELEASE'

}

編集後、build.gradleを右クリックして「Gradle」⇒「Gradle プロジェクトのリフレッシュ」を押下します。

build.gradleで定義した依存先ライブラリがダウンロードされて、Springのライブラリを使用した開発ができるようになりました。

Hello Worldアプリの実装

以下の4ファイルを実装します。

web.xml

webサーバに対して、webアプリのServletの情報などを定義します。

src/main/webapp/WEB-INF/web.xml (すでにできているので、この内容で上書きします)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>hello</display-name>

    <!-- サーブレットとしてSpringのDispatcherServletを登録 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- Bean定義XMLを指定 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

applicationContext.xml

SpringのBean定義ファイルです。

src/main/webapp/WEB-INF/applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!-- アノテーションでBeanコンポーネントに指定するクラスをスキャンするベースパッケージ -->
    <context:component-scan base-package="hello.controller" />

    <!-- アノテーションを有効にするおまじない? -->
    <mvc:annotation-driven />

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

    <!-- Thymeleafのリゾルバ等の設定 -->
    <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
        <!-- Controllerで次のView名を"hoge"とすると、/WEB-INF/views/hoge.html を探しに行く設定 -->
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5" />
        <property name="characterEncoding" value="UTF-8" />
    </bean>

    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver" />
    </bean>

    <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="templateEngine" ref="templateEngine" />
        <property name="characterEncoding" value="UTF-8" />
    </bean>

</beans>

HelloController.java

Springのコントローラークラスです。

src/main/java/hello/controller/HelloController.java (helloパッケージの中にcontrollerパッケージを作成してから当クラスを作成してください)

package hello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("world")
    public String hello(Model model) {
        model.addAttribute("text", "Hello Spring World !!");
        return "hello";
    }
}

hello.html

Thymeleafを使用したHTMLファイルです。

src/main/webapp/WEB-INF/views/hello.html

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Hello Spring</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <h1 th:text="${text}"></h1>
  </body>
</html>

# Gradleプロジェクトを作成すると、初期状態で「Library.java」と「LibraryTest.java」が作成されていますが、不要なので削除してください。

最終的な構成は以下のようになります。

デプロイ&疎通確認

もうちょっとです。がんばりましょう!

Tomcat9サーバを登録

まずはサーバービューを表示します。

画面上部のメニューから、「ウィンドウ」⇒「ビューの表示」⇒「その他」を選択します。

「サーバー」⇒「サーバー」を選択し、「開く」を押下します。

サーバービューが表示されます。初期状態では「使用可能なサーバーがありません。このリンクをクリックして新規サーバーを作成してください…」と表示されているので、このリンクをクリックします。

今回はPleiades All in One に同梱されているTomcat9サーバーを使用します。

「サーバーのタイプを選択」では、「Apache」⇒「Tomcat v9.0 サーバー」を選択します。
Tomcat9のデフォルト設定では、JREがJava11になっています。これをJava8に変更したいので、デフォルトで設定されるサーバー・ランタイム環境は使用しません。その右の「追加」を押下してください。
# 上記に伴い、サーバー名にデフォルトで(Java11)と入力されています(画像の範囲選択されている部分)。紛らわしいので(というか嘘なので)、必須ではありませんがこの部分を消しておくことをオススメします。

「JRE」のプルダウンを展開し、「java8」を選択します。
選択したら、「完了」を押下します。

元の画面に戻るので、「サーバー・ランタイム環境」に追加した環境の名前が設定されていることを確認して、「完了」を押下します。サーバービューに登録したサーバーが表示されていれば完了です。

ビルド&デプロイ

プロジェクトのクリーン

画面上のメニューから「プロジェクト」⇒「クリーン」を選択します。
# 初期状態では、その下の「自動的にビルド」にチェックがついていますが、個人的にはこれは外してビルド時には手動でクリーンすることをオススメします。(Eclipseのワークスペースにいろいろなプロジェクトができてきたときに、常にビルドが走っているような状態になって重くなる原因になります)

「すべてのプロジェクトをクリーン」のチェックを外し、ビルドするプロジェクト(今回は「hello」)にチェックをつけます。
「ビルドを即時に開始」にチェックがついていることを確認し、その下のラジオボタンを「選択したプロジェクトのみビルド」に変更します。その後、「クリーン」を押下します。自動的にクリーン&ビルドが開始されます。

# 今の段階ではビルドは数秒で完了します。プロジェクトが大きくなってくるとビルドに時間がかかるようになるので、その場合は「進行状況」ビューを開いて確認してください。

サーバにデプロイ

サーバービューからデプロイをします。
サーバービューに表示されている、上の手順で設定したTomcat9のサーバを右クリックして「追加および除去」を選択します。

左側の「使用可能」のエリアの中に、デプロイしたいプロジェクト(今回は「hello」)が表示されているので、それをクリックして選択した状態で「追加」を押下します。すると、選択したプロジェクトが右側の「構成済み」のエリアに移動します。その状態で「完了」を押下します。
# 使用可能エリアにプロジェクトが表示されない場合は、「動的webモジュール」の設定が不完全であることが予想されます。右の目次から「プロジェクトのプロパティ設定」の項目に飛んで設定を確認してください。

Tomcat9のサーバ内にデプロイしたプロジェクトが含まれていることを確認して、右クリックして「開始」を押下します。

Tomcat9サーバが起動して、コンソールビューにログが表示されます。
「情報: サーバーの起動 [5000]ms [土 1 1 00:00:00 JST 2021]」のような情報が表示されたら起動完了です。

ブラウザからアクセス

いよいよ、ブラウザからアクセスしてみましょう!
今回の例では、URLは「http://localhost:8080/hello/world」となります。

無事に表示されたら環境構築は完了です。おつかれさまでした!


 

おわりに

結局しっかりとした環境にあげるときはwarファイルとかで固めるので、ローカルの環境なんてできるだけ楽して作れたらそれでいいよな~という方針で考えた結果、Pleiades All in Oneパッケージをフル活用した環境構築になりました。最初はSpring Tool Suiteを使ってみたりとちょっと凝った構成でやろうとしていたのですが、結果ハマりにハマって諦めて…みたいな屈辱を味わっていました。
この記事を通して、少しでも環境構築で不幸になる人が減ったらいいなと願っています。

やっぱり環境構築は嫌いだ!!!

コメント

タイトルとURLをコピーしました