3.1. Webアプリケーション向け開発プロジェクトの作成

本節では、Webアプリケーション向けの開発プロジェクトを作成する方法について説明する。

本ガイドラインでは、マルチプロジェクト構成を採用することを推奨している。推奨するマルチプロジェクト構成の説明については、「プロジェクト構成」を参照されたい。


3.1.1. ブランクプロジェクトの種類

ブランクプロジェクトは、使用用途に応じて以下の2種類を提供している。

種別

使用用途

商用環境にリリースするような本格的なアプリケーションを開発する際に使用する。

プロジェクトの雛形は、MavenのArchetypeとして以下を用意している。

  • MyBatis3用の設定が盛り込まれた雛形

本ガイドラインでは、マルチプロジェクト構成のプロジェクトを使用する事を推奨している。

POC(Proof Of Concept)、プロトタイプ、サンプルなどの簡易的なアプリケーションを作成する際に使用する。

プロジェクトの雛形は、MavenのArchetypeとして以下を用意している。

  • MyBatis3用の設定が盛り込まれた雛形

  • O/R Mapperに依存しない雛形

本ガイドラインでは、各種チュートリアルについてシングルプロジェクトを使用して行う手順となっている。


3.1.2. 開発プロジェクトの作成

マルチプロジェクト構成の開発プロジェクトを、 Maven Archetype Pluginarchetype:generateを使用して作成する。

Note

前提条件

以降の説明では、

  • Maven(mvnコマンド)が使用可能であること

  • インターネットに繋がっていること

  • インターネットにプロキシ経由で繋ぐ場合は、Mavenのプロキシ設定が行われていること

を前提としている。

前提条件が整っていない場合は、まずこれらのセットアップを行ってほしい。


マルチプロジェクトを作成するためのArchetypeとして、以下を用意している。

項番

Archetype(ArtifactId)

説明

macchinetta-multi-web-blank-jsp-mybatis3-archetype

O/R MapperとしてMyBatis3を使用するためのプロジェクトを生成するためのArchetype。


プロジェクトを作成するフォルダに移動する。

cd C:\work

Maven Archetype Pluginarchetype:generateを使用して、プロジェクトを作成する。

mvn archetype:generate -B^
 -DarchetypeGroupId=com.github.macchinetta.blank^
 -DarchetypeArtifactId=macchinetta-multi-web-blank-jsp-mybatis3-archetype^
 -DarchetypeVersion=1.10.0.RELEASE^
 -DgroupId=com.example.todo^
 -DartifactId=todo^
 -Dversion=1.0.0-SNAPSHOT

パラメータ

説明

-B

batch mode (対話を省略)

-DarchetypeGroupId

ブランクプロジェクトのgroupIdを指定する。(固定)

-DarchetypeArtifactId

ブランクプロジェクトのarchetypeId(雛形を特定するためのID)を指定する。(カスタマイズが必要)

以下の何れかのarchetypeIdを指定する。

  • macchinetta-multi-web-blank-jsp-mybatis3-archetype

  • macchinetta-multi-web-blank-thymeleaf-mybatis3-archetype

  • macchinetta-multi-web-blank-xmlconfig-jsp-mybatis3-archetype

  • macchinetta-multi-web-blank-xmlconfig-thymeleaf-mybatis3-archetype

上記例では、macchinetta-multi-web-blank-jsp-mybatis3-archetypeを指定している。

-DarchetypeVersion

ブランクプロジェクトのバージョンを指定する。(固定)

-DgroupId

作成するプロジェクトのgroupIdを指定する。(カスタマイズが必要)

上記例では、com.example.todoを指定している。

-DartifactId

作成するプロジェクトのartifactIdを指定する。(カスタマイズが必要)

上記例では、todoを指定している。

-Dversion

作成するプロジェクトのバージョンを指定する。(カスタマイズが必要)

上記例では、1.0.0-SNAPSHOTを指定している。


プロジェクトの作成が成功した場合、以下のようなログが出力される。
(以下は、MyBatis3用(JavaConfig, JSP)のArchetypeを使用して作成した場合の出力例)
(omitted)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: macchinetta-multi-web-blank-jsp-mybatis3-archetype:1.10.0.RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.example.todo
[INFO] Parameter: artifactId, Value: todo
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: package, Value: com.example.todo
[INFO] Parameter: packageInPathFormat, Value: com/example/todo
[INFO] Parameter: package, Value: com.example.todo
[INFO] Parameter: ProjectName, Value: Todo
[INFO] Parameter: groupId, Value: com.example.todo
[INFO] Parameter: artifactId, Value: todo
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parent element not overwritten in C:\work\Git\home\tmp\todo\todo-env\pom.xml
[INFO] Parent element not overwritten in C:\work\Git\home\tmp\todo\todo-domain\pom.xml
[INFO] Parent element not overwritten in C:\work\Git\home\tmp\todo\todo-web\pom.xml
[INFO] Parent element not overwritten in C:\work\Git\home\tmp\todo\todo-initdb\pom.xml
[INFO] Parent element not overwritten in C:\work\Git\home\tmp\todo\todo-selenium\pom.xml
[INFO] Project created from Archetype in dir: C:\work\Git\home\tmp\todo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  9.303 s
[INFO] Finished at: 2023-07-10T18:06:30+09:00
[INFO] ------------------------------------------------------------------------

プロジェクトの作成が成功した場合、Mavenのマルチプロジェクトが作成される。
Maven Archetypeで作成したプロジェクトの詳細な説明については、「開発プロジェクトの構成」を参照されたい。
todo
├── pom.xml
├── todo-domain
├── todo-env
├── todo-initdb
├── todo-selenium
└── todo-web

3.1.3. 開発プロジェクトのカスタマイズ

Maven Archetypeで作成したプロジェクトには、アプリケーション毎にカスタマイズが必要な箇所がいくつか存在する。

カスタマイズが必要な箇所を以下に示す。

Note

上記以外のカスタマイズポイントとしては、

などがある。

これらのカスタマイズについては、各節のHow to useを参照し、必要に応じてカスタマイズしてほしい。

Note

以降の説明で[artifactId]と表現している部分は、プロジェクト作成時に指定したartifactIdに置き換えて読み進めてほしい。


3.1.3.1. POMファイル

3.1.3.1.1. プロジェクト情報

Maven Archetypeで作成したプロジェクトのPOMファイルでは、

  • プロジェクト名(name要素)

  • プロジェクト説明(description要素)

  • プロジェクトURL(url要素)

  • プロジェクト創設年(inceptionYear要素)

  • プロジェクトライセンス(licenses要素)

  • プロジェクト組織(organization要素)

といったプロジェクト情報が、Archetype自身のプロジェクト情報が設定されている状態となっている。
例として、ブランクプロジェクトで設定している内容を以下に示す。
プロジェクト情報には、適切な値を設定すること。
<!-- omitted -->

<name>Macchinetta Server Framework (1.x) Web Blank Multi Project (JavaConfig)(JSP)(MyBatis3)</name>
<description>Web Blank Multi Project (JavaConfig)(JSP)(MyBatis3) using Macchinetta Server Framework (1.x)</description>
<url>http://macchinetta.github.io</url>
<inceptionYear>2017</inceptionYear>
<licenses>
    <license>
        <name>Apache License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        <distribution>manual</distribution>
    </license>
</licenses>
<organization>
    <name>Macchinetta Framework Team</name>
    <url>http://macchinetta.github.io</url>
</organization>

<!-- omitted -->

Tip

JDK17を使用してマルチプロジェクトのarchetypeを生成すると、親POMに余分な空行が追加されることを確認している。

動作に影響はないため、適宜空白行を削除して使用されたい。


カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

マルチプロジェクト全体の構成を定義するPOM(Project Object Model)ファイル

[artifactId]/pom.xml

プロジェクト情報に適切な値を指定する。


3.1.3.1.2. maven-compiler-plugin

Maven Archetypeで作成したプロジェクトのPOMファイルでは、以下の様にmaven-compiler-pluginが設定されている。

<!-- omitted -->

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <!-- (1) -->
    <parameters>true</parameters>
    <annotationProcessorPaths>
      <path>
        <!-- (2) -->
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
      </path>
      <!-- REMOVE THIS LINE IF YOU USE MapStruct AND Lombok
      <path>
        <!-- (3) -->
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
      <path>
        <!-- (3) -->
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-mapstruct-binding</artifactId>
        <version>${lombok-mapstruct-binding.version}</version>
      </path>
      REMOVE THIS LINE IF YOU USE MapStruct AND Lombok -->
    </annotationProcessorPaths>
    <compilerArgs>
      <!-- (2) -->
      <arg>-Amapstruct.defaultComponentModel=spring</arg>
    </compilerArgs>
  </configuration>
</plugin>

configurationについては以下の通り

項番

概要

Java8から追加された-parametersオプション(メソッド・パラメータにリフレクション用のメタデータを生成するモード)
Spring の各機能は-parametersが設定されていることを前提としており、-parametersを設定していない場合、@RequestParam@PathVariableの属性省略ができなくなる、XMLConfigでBean定義する際に変数を名前で解決することができなくなる等の問題が発生する。

MapStructsを使用するための設定。詳しくはMapStructを使用するための設定を参照されたい。

MapStructとLombokを併用するための設定。詳しくはLombokを使用する際の設定を参照されたい。


3.1.3.2. x.xx.fw.9999形式のメッセージID

Maven Archetypeで作成したプロジェクトでは、x.xx.fw.9999形式のメッセージIDを、

  • エラー画面に表示するメッセージ

  • 例外発生時に出力するエラーログ

を生成する際に使用している。実際の使用箇所(サンプリング)を以下に示す。

[application-messages.properties]

e.xx.fw.5001 = Resource not found.

[JSP]

<div class="error">
    <c:if test="${!empty exceptionCode}">[${f:h(exceptionCode)}]</c:if>
    <spring:message code="e.xx.fw.5001" />
</div>

[applicationContext.xml]

<bean id="exceptionCodeResolver"
    class="org.terasoluna.gfw.common.exception.SimpleMappingExceptionCodeResolver">
    <!-- omitted -->
            <entry key="ResourceNotFoundException" value="e.xx.fw.5001" />
    <!-- omitted -->
</bean>

x.xx.fw.9999形式のメッセージIDは、本ガイドラインの「メッセージ管理」で紹介しているメッセージID体系であるが、プロジェクト区分の値が暫定値「xx」の状態になっている。

Note

  • 本ガイドラインで紹介しているメッセージID体系を利用する場合は、プロジェクト区分に適切な値を指定すること。本ガイドラインで紹介しているメッセージID体系については、「結果メッセージ」を参照されたい。

  • 本ガイドラインで紹介しているメッセージID体系を利用しない場合は、以下に示す修正対象ファイル内で使用しているメッセージIDを全て置き換える必要がある。


カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

メッセージ定義ファイル

[artifactId]/[artifactId]-web/src/main/resources/i18n/application-messages.properties

プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「xx」を、適切な値に修正する。

エラー画面用のJSP

[artifactId]/[artifactId]-web/src/main/webapp/WEB-INF/views/common/error/*.jsp

<spring:message>要素のcode属性に指定しているメッセージIDのプロジェクト区分の暫定値「xx」を、適切な値に修正する。

Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル

[artifactId]/[artifactId]-web/src/main/java/com/example/todo/config/app/ApplicationContextConfig.java

BeanIDがexceptionCodeResolverのBean定義内で指定している例外コード(メッセージID)のプロジェクト区分の暫定値「xx」を、適切な値に修正する。


3.1.3.3. メッセージ文言

Maven Archetypeで作成したプロジェクトでは、いくつかのメッセージ定義を提供しているが、メッセージ文言は簡易的なメッセージになっている。
例として、ブランクプロジェクトのメッセージ(サンプリング)を以下に示す。
アプリケーション要件(メッセージ規約など)に合わせて修正すること。

[application-messages.properties]

e.xx.fw.5001 = Resource not found.

# omitted

# typemismatch
typeMismatch="{0}" is invalid.

# omitted

カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

メッセージ定義ファイル

[artifactId]/[artifactId]-web/src/main/resources/i18n/application-messages.properties

アプリケーション要件に応じたメッセージに修正する。

入力チェックでエラーとなった際に表示するメッセージ(Bean Validationのメッセージ)についても、アプリケーション要件に応じて修正(デフォルトメッセージの上書き)が必要になる。
デフォルトメッセージの上書き方法については、「エラーメッセージの定義」を参照されたい。

3.1.3.4. エラー画面

Maven Archetypeで作成したプロジェクトでは、エラーの種類毎にエラー画面を表示するためのJSP及びHTMLを提供しているが、

  • 画面レイアウト

  • 画面タイトル

  • メッセージの文言

などが簡易的な実装になっている。
例として、ブランクぽプロジェクトの実装(サンプリング)を以下に示す。
エラー画面を表示するためのJSPとHTMLについては、アプリケーション要件(UI規約など)に合わせて修正すること。

[JSP]

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Resource Not Found Error!</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/app/css/styles.css">
</head>
<body>
    <div id="wrapper">
        <h1>Resource Not Found Error!</h1>
        <div class="error">
            <c:if test="${!empty exceptionCode}">[${f:h(exceptionCode)}]</c:if>
            <spring:message code="e.xx.fw.5001" />
        </div>
        <t:messagesPanel />
        <br>
        <!-- omitted -->
        <br>
    </div>
</body>
</html>

カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

エラー画面用のJSP

[artifactId]/[artifactId]-web/src/main/webapp/WEB-INF/views/common/error/*.jsp

アプリケーション要件(UI規約など)に合わせて修正する。

エラー画面を表示するJSPをカスタマイズする際は、「例外ハンドリングコーディングポイント(JSP/Thymeleaf編)」を参照されたい。

エラー画面用のHTML

[artifactId]/[artifactId]-web/src/main/webapp/WEB-INF/views/common/error/unhandledSystemError.html

アプリケーション要件(UI規約など)に合わせて修正する。


3.1.3.5. 画面フッターの著作権

Maven Archetypeで作成したプロジェクトでは、画面フッター部の著作権が暫定値「Copyright &copy; 20XX CompanyName」の状態になっているため、適切な値を指定すること。
例として、ブランクプロジェクトの実装(サンプリング)を以下に示す。

[home.jsp]

<div class="container">
    <jsp:include page="../layout/header.jsp" />
    <div id="wrapper">
        <h1 id="title">Hello world!</h1>
        <p>The time on the server is ${serverTime}.</p>
    </div>
    <hr>
    <jsp:include page="../layout/fotter.jsp" />
</div>

[footer.jsp]

<p style="text-align: center; background: #e5eCf9;">Copyright &copy; 20XX CompanyName</p>

カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

フッターJSP

[artifactId]/[artifactId]-web/src/main/webapp/WEB-INF/views/layout/footer.jsp

著作権の暫定値「Copyright &copy; 20XX CompanyName」を適切な値に修正する。


3.1.3.6. インメモリデータベース(H2 Database)

Maven Archetypeで作成したプロジェクトには、インメモリデータベース(H2 Database)をセットアップするための設定が行われているが、これはちょっとした動作検証(プロトタイプ作成やPOC(Proof Of Concept))を行うための設定である。そのため、本格的なアプリケーション開発を行う場合は、不要な設定になる。

Note

本格的なアプリケーション開発を行う場合は、インメモリデータベース(H2 Database)をセットアップするための定義とSQLを管理するためのディレクトリを削除すること。

[artifactId]EnvConfig.java

@Value("${database}")
private String database;

@Bean
public DataSourceInitializer dataSourceInitializer() {
    DataSourceInitializer bean = new DataSourceInitializer();
    bean.setDataSource(dataSource());

    ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
    databasePopulator.addScript(new ClassPathResource("/database/" + database + "-schema.sql"));
    databasePopulator.addScript(new ClassPathResource("/database/" + database + "-dataload.sql"));
    databasePopulator.setSqlScriptEncoding("UTF-8");
    databasePopulator.setIgnoreFailedDrops(true);
    bean.setDatabasePopulator(databasePopulator);
    return bean;
}
└── src
    └── main
        └── resources
            ├── META-INF
          (...)
            ├── database
            │   ├── H2-dataload.sql
            │   └── H2-schema.sql

カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

環境依存するコンポーネントを定義するBean定義ファイル

[artifactId]-env/src/main/java/com/example/todo/config/app/[artifactId]EnvConfig.java

DataSourceInitializerBeanを削除する。

インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ

[artifactId]/[artifactId]-env/src/main/resources/database/

ディレクトリを削除する。


3.1.3.7. データソース設定

Maven Archetypeで作成したプロジェクトでは、インメモリデータベース(H2 Database)にアクセスするためのデータソース設定が行われているが、これはちょっとした動作検証(プロトタイプ作成やPOC(Proof Of Concept))を行うための設定である。そのため、本格的なアプリケーション開発を行う場合は、アプリケーション稼働時に利用するデータベースにアクセスするためのデータソース設定に変更する必要がある。

[artifactId]/[artifactId]-domain/pom.xml

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Note

上記設定例は、依存ライブラリのバージョンを親プロジェクトである terasoluna-gfw-parent で管理する前提であるため、pom.xmlでのバージョンの指定は不要である。

上記の依存ライブラリはterasoluna-gfw-parentが依存しているSpring Bootで管理されている。

[artifactId]-infra.properties

database=H2
database.url=jdbc:h2:mem:todo;DB_CLOSE_DELAY=-1
database.username=sa
database.password=
database.driverClassName=org.h2.Driver
# connection pool
cp.maxActive=96
cp.maxIdle=16
cp.minIdle=0
cp.maxWait=60000

[artifactId]EnvConfig.java

@Value("${database.url}")
private String url;

@Value("${database.username}")
private String username;

@Value("${database.password}")
private String password;

@Value("${cp.maxActive}")
private Integer maxActive;

@Value("${cp.maxIdle}")
private Integer maxIdle;

@Value("${cp.minIdle}")
private Integer minIdle;

@Value("${cp.maxWait}")
private Integer maxWait;

@Bean(name = "dataSource", destroyMethod = "close")
public DataSource dataSource() {
    BasicDataSource bean = new BasicDataSource();
    bean.setDriverClassName(driverClassName);
    bean.setUrl(url);
    bean.setUsername(username);
    bean.setPassword(password);
    bean.setDefaultAutoCommit(false);
    bean.setMaxTotal(maxActive);
    bean.setMaxIdle(maxIdle);
    bean.setMinIdle(minIdle);
    bean.setMaxWait(Duration.ofMillis(maxWait));
    return bean;
}

Note

本格的なアプリケーション開発を行う場合は、アプリケーション稼働時に利用するデータベースにアクセスするためのデータソース設定に変更すること。

Maven Archetypeで作成したプロジェクトでは、Apache Commons DBCPを使用する設定となっているが、アプリケーションサーバから提供されているデータソースを使用して、JNDI(Java Naming and Directory Interface)経由でデータソースにアクセスする方法を採用するケースも多い。

開発環境ではApache Commons DBCPのデータソースを使用して、テスト環境及び商用環境ではアプリケーションサーバから提供されているデータソースを使用するといった使い分けを行うケースもある。

データソースの設定方法については、「データベースアクセス(共通編)データソースの設定」を参照されたい。


カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。

項番

対象ファイル

カスタマイズ方法

POMファイル

  • [artifactId]/pom.xml

  • [artifactId]/[artifactId]-web/pom.xml

インメモリデータベース(H2 Database)のJDBCドライバを依存ライブラリから削除する。

アプリケーション稼働時に利用するデータベースにアクセスするためのJDBCドライバを依存ライブラリに追加する。

環境依存する設定値を定義するプロパティファイル

[artifactId]/[artifactId]-env/src/main/resources/META-INF/spring/[artifactId]-infra.properties

データソースとしてApache Commons DBCPを使用する場合は、以下のプロパティにアプリケーション稼働時に利用するデータベースにアクセスするための接続情報を指定する。

  • database

  • database.url

  • database.username

  • database.password

  • database.driverClassName

アプリケーションサーバから提供されているデータソースを使用する場合は、以下のプロパティ以外は不要なプロパティになるので削除する。

  • database

環境依存するコンポーネントを定義するBean定義ファイル

[artifactId]/[artifactId]-env/src/main/java/com/example/project/config/app/[artifactId]EnvConfig.java

アプリケーションサーバから提供されているデータソースを使用する場合は、JNDI経由で取得したデータソースを使用するように設定を変更する。

データソースの設定方法については、「データベースアクセス(共通編)データソースの設定」を参照されたい。

Note

環境依存する設定値を定義するプロパティファイルのdatabaseプロパティについて

O/R MapperとしてMyBatisを使用する場合は、databaseプロパティは不要なプロパティである。削除してもよいが、使用しているデータベースを明示するために設定を残しておいてもよい。

Tip

JDBCドライバの追加方法について

使用するデータベースがPostgreSQLとOracleの場合は、POMファイル内のコメントアウトを外せばよい。JDBCドライバのバージョンについては、使用するデータベースのバージョンに対応するバージョンに修正すること。

ただしOracleを使用する場合は、コメントを外す前に、MavenのローカルリポジトリにOracleのJDBCドライバをインストールしておく必要がある。

以下は、PostgreSQLを使用する場合の設定例である。

  • [artifactId]/pom.xml

                 <dependency>
                     <groupId>org.postgresql</groupId>
                     <artifactId>postgresql</artifactId>
                     <version>${postgresql.version}</version>
                 </dependency>
    <!--         <dependency> -->
    <!--             <groupId>com.oracle.database.jdbc</groupId> -->
    <!--             <artifactId>ojdbc11</artifactId> -->
    <!--             <version>${ojdbc.version}</version> -->
    <!--         </dependency> -->
    
                 <!-- omitted -->
    
                 <postgresql.version>42.5.1</postgresql.version>
                 <ojdbc.version>21.8.0.0</ojdbc.version>
    
  • [artifactId]/[artifactId]-web/pom.xml

                 <dependency>
                    <groupId>org.postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                     <scope>runtime</scope>
                 </dependency>
    <!--         <dependency> -->
    <!--             <groupId>com.oracle.database.jdbc</groupId> -->
    <!--             <artifactId>ojdbc11</artifactId> -->
    <!--             <scope>runtime</scope> -->
    <!--         </dependency> -->
    

    項番

    説明

    (1)

    JDBCドライバはコンパイルには使用せず、アプリケーション実行時のみ使用するため、runtimeスコープを指定している。

    単体テストで使用する場合などは、適切なスコープに変更して使用されたい。


3.1.4. 開発プロジェクトの構成

Maven Archetypeで作成したプロジェクトの構成について説明する。

Maven Archetypeで作成したプロジェクトは、以下の構成になっている。

  • 本ガイドラインで推奨しているレイヤ毎のプロジェクト構成

  • 本ガイドラインで紹介している環境依存性の排除を考慮したプロジェクト構成

  • CI(Continuous Integration)を意識したプロジェクト構成

また、本ガイドラインで推奨している各種設定が盛り込まれた、

  • Webアプリケーションの構成定義ファイル(web.xml)

  • Spring FrameworkのBean定義ファイル

  • Spring MVC用のBean定義ファイル

  • Spring Security用のBean定義ファイル

  • O/R Mapperの設定ファイル

  • プロパティファイル(メッセージ定義ファイルなど)

と、アプリケーション要件との依存度が低い(=どんなアプリケーションでも作成する必要がある)コンポーネントの簡易実装として、

  • Welcomeページを表示するためのControllerとJSPまたはテンプレートHTML

  • エラー画面を表示するためのJSP(HTML)またはテンプレートHTML

  • JSPタグライブラリの読み込み設定などが定義されているインクルード用JSP

  • Thymeleafのテンプレートレイアウト用のHTML

  • アプリケーション全体の画面スタイルを定義するCSSファイル

などが提供されている。

Warning

簡易実装として提供しているコンポーネントの扱いについて

簡易実装として提供しているコンポーネントは、以下のいずれかの対応を行うこと。

  • アプリケーション要件にあわせて修正

  • 不要なコンポーネントは削除

Note

REST API用のプロジェクトを作成する場合の手順について

Maven Archetypeで作成したプロジェクトは、伝統的なWebアプリケーション(リクエストパラメータを受け取ってHTMLを応答するアプリケーション)を構築する際に必要となる推奨設定が行われている。

そのため、JSONやXMLを扱うREST APIを構築する際には不要な設定が存在する。 REST APIを構築するためのプロジェクトを作成する場合は、「RESTful Web Serviceアプリケーションの設定」を参照し、REST API向けの設定を適用してほしい。


3.1.4.1. マルチプロジェクトの構成

まず、マルチプロジェクト全体の構成について説明する。

[artifactId]
    ├── pom.xml  ... (1)
    ├── [artifactId]-web  ... (2)
    ├── [artifactId]-domain  ... (3)
    ├── [artifactId]-env  ... (4)
    ├── [artifactId]-initdb  ... (5)
    └── [artifactId]-selenium  ... (6)
項番
説明
(1)

マルチプロジェクト全体の構成を定義するPOM(Project Object Model)ファイル。

このファイルでは、主に以下の定義を行う。

  • 依存ライブラリのバージョン

  • ビルド用のプラグインの設定(ビルド方法の設定)

マルチプロジェクトの階層関係については、「プロジェクトの階層構造」を参照されたい。

(2)

アプリケーション層(Web層)のコンポーネントを管理するモジュール。

このモジュールでは、主に以下のコンポーネントやファイルを管理する。

  • Controllerクラス

  • 相関チェック用のValidatorクラス

  • Formクラス(REST APIの場合はResourceクラス)

  • View(JSP/Thymeleaf)

  • CSSファイル

  • JavaScriptファイル

  • アプリケーション層のコンポーネント用のJUnit

  • アプリケーション層のコンポーネントを定義するためのBean定義ファイル

  • Webアプリケーションの構成定義ファイル(web.xml)

  • メッセージ定義ファイル

(3)

ドメイン層のコンポーネントを管理するモジュール。

このモジュールでは、主に以下のコンポーネントやファイルを管理する。

  • Entityなどのドメインオブジェクト

  • Repository

  • Service

  • DTO

  • ドメイン層のコンポーネント用のJUnit

  • ドメイン層のコンポーネントを定義するためのBean定義ファイル

(4)

環境依存性をもつ設定ファイルを管理するモジュール。

このモジュールでは、主に以下のファイルを管理する。

  • 環境依存するコンポーネントを定義するためのBean定義ファイル

  • 環境依存するプロパティ値を定義するプロパティファイル

(5)

データベースを初期化するためのSQLファイルを管理するモジュール

このモジュールでは、主に以下のファイルを管理する。

  • テーブルなどのデータベースオブジェクトを作成するためのSQLファイル

  • マスタデータなどの初期データを投入するためのSQLファイル

  • E2E(End To End)テストで使用するテストデータを投入するためのSQLファイル

(6)

Seleniumを使用したE2Eテスト用のコンポーネントを管理するモジュール。

このモジュールでは、主に以下のファイルを管理する。

  • Seleniumを操作してテストを行うJUnit

  • Assert時に使用する期待値ファイル(必要に応じて)

Note

本ガイドラインにおける「マルチプロジェクト」の用語定義について

Maven Archetypeで作成したプロジェクトは、正確にはマルチモジュール構成のプロジェクトとなる。

本ガイドラインでは、マルチモジュールとマルチプロジェクトを同じ意味で使用していることを補足しておく。

Note

2つのWebアプリケーションと1つの共通ライブラリが必要となる開発プロジェクトについて

  • bar-parent
  • bar-initdb
  • bar-common
  • bar-common-web
  • bar-domain-a
  • bar-domain-b
  • bar-web-a
  • bar-web-b
  • bar-env
  • bar-web-a-selenium
  • bar-web-b-selenium

それぞれのプロジェクトの内容は下記のようになる。

  • bar-parent
    parent-pom(親POM)と呼ばれるプロジェクト。pom.xmlファイルだけを持ち、その他のソースコードや設定ファイルは一切持たない、シンプルなプロジェクト。
    他のプロジェクトのpom上で、このbar-parentプロジェクトを<parent>タグに指定することによって、親POMに指定された共通設定情報を自身に反映させることができる。
  • bar-initdb
    RDBMSのテーブル定義(DDL)と初期データをINSERTするためのSQL文を格納する。これもmavenプロジェクトとして管理する。
    pom.xmlにsql-maven-pluginの設定を定義することにより、ビルドライフサイクルの過程で任意のRDBMSに対するDDL文や初期データINSERT文の実行を自動化することができる。
  • bar-common
    プロジェクト共通ライブラリを格納する。ここはweb非依存にし、webに関わるクラスはbar-common-webに配置する。
  • bar-common-web
    プロジェクト共通webライブラリを格納する
  • bar-domain-a
    aドメインに関わるドメイン層のjavaクラス、単体テストケース等を格納するプロジェクト。最終的に*.jarファイル化する。
  • bar-domain-b
    bドメインに関わるドメイン層のクラス。
  • bar-web-a
    アプリケーション層のjavaクラス、jsp/html、設定ファイル、単体テストケース等を格納するプロジェクト。最終的にWebアプリケーションとして*.warファイル化する。
    bar-web-aは、bar-commonとbar-envへの依存性を持つ。
  • bar-web-b
    もう一つのサブシステムとしてのWebアプリケーション。構造はbar-web-aと同じ。
  • bar-env
    環境依存性のある設定ファイルだけを集めるプロジェクト。
  • bar-web-a-selenium
    web-aプロジェクトのための、Selenium WebDriverによるテストケースを格納するプロジェクト。
  • bar-web-b-selenium
    web-bプロジェクトのための、Selenium WebDriverによるテストケースを格納するプロジェクト。

3.1.4.2. webモジュールの構成

アプリケーション層(Web層)のコンポーネントを管理するモジュールの構成について説明する。

[artifactId]-web
    ├── pom.xml  ... (1)
項番
説明
(1)

webモジュールの構成を定義するPOM(Project Object Model)ファイル。このファイルでは、以下の定義を行う。

  • 依存ライブラリとビルド用プラグインの定義

  • warファイルを作成するための定義

Note

REST API用のプロジェクトを作成する際のwebモジュールのモジュール名について

REST APIを構築する場合は、モジュール名を[artifactId]-apiといった感じの名前にしておくと、アプリケーションの種類が識別しやすくなる。


└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── project
    │   │               ├── app  ... (2)
    │   │               │   └── welcome
    │   │               │         └── HelloController.java  ... (4)
    │   │               └── config
    │   │                   ├── app
    │   │                   │     └── ApplicationContextConfig.java  ... (7)
    │   │                   └── web
    │   │                         ├── SpringMvcConfig.java  ... (8)
    │   │                         └── SpringSecurityConfig.java  ... (9)
    │   ├── resources
    │   │   ├── META-INF
    │   │   │   └── spring  ... (5)
    │   │   │       └── application.properties  ... (6)
    │   │   └── i18n  ... (10)
    │   │       └── application-messages.properties  ... (11)
項番
説明
(2)

アプリケーション層のクラスを格納するためのパッケージ。

REST APIを構築する場合は、パッケージ名をapiといった感じの名前にしておくと、 コンポーネントの種類が識別しやすくなる。

(4)

Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。

(5)

Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。

(6)

アプリケーション層で使用する設定値を定義するプロパティファイル。

作成時点では、空のファイルである。

(7)

Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。

このファイルには、以下のBeanを定義する。

  • Webアプリケーション全体で使用するコンポーネント

  • ドメイン層のコンポーネント(ドメイン層のコンポーネントが定義されているBean定義ファイルをimportする)

(8)

DispatcherServlet用のアプリケーションコンテキストを作成するためのBean定義ファイル。

このファイルには、以下のBeanを定義する。

  • Spring MVCのコンポーネント

  • アプリケーション層のコンポーネント

REST APIを構築する場合は、ファイル名をSpringMvcApiConfig.javaといった感じの名前にしておくと、 アプリケーションの種類が識別しやすくなる。

(9)

Spring Securityのコンポーネントを定義するためのBean定義ファイル。

このファイルは、Webアプリケーション用のアプリケーションコンテキストを作成する際に読み込む。

(10)

アプリケーション層で使用するメッセージ定義ファイルを格納するディレクトリ。

(11)
アプリケーション層で使用するメッセージを定義するプロパティファイル。
作成時点では、いくつかの汎用的なメッセージが定義されている。
アプリケーションの要件(メッセージ規約など)にあわせて必ず修正すること。
メッセージ定義については、「メッセージ管理」を参照されたい。

Note

アプリケーションコンテキストとBean定義ファイルの関連については、「アプリケーションコンテキストの構成とBean定義ファイルの関係」を参照されたい。


│   └── webapp
│       ├── WEB-INF
│       │   ├── views  ... (12)
│       │   │   ├── common
│       │   │   │   ├── error  ... (13)
│       │   │   │   │   ├── accessDeniedError.jsp
│       │   │   │   │   ├── businessError.jsp
│       │   │   │   │   ├── dataAccessError.jsp
│       │   │   │   │   ├── invalidCsrfTokenError.jsp
│       │   │   │   │   ├── missingCsrfTokenError.jsp
│       │   │   │   │   ├── resourceNotFoundError.jsp
│       │   │   │   │   ├── systemError.jsp
│       │   │   │   │   ├── transactionTokenError.jsp
│       │   │   │   │   └── unhandledSystemError.html
│       │   │   │   └── include.jsp  ... (14)
│       │   │   ├── layout  ... (15)
│       │   │   │   ├── header.jsp
│       │   │   │   └── footer.jsp
│       │   │   └── welcome
│       │   │       └── home.jsp  ... (16)
│       │   └── web.xml  ... (17)
│       └── resources  ... (18)
│           └── app
│               └── css
│                   └── styles.css  ... (19)
└── test
    ├── java
    └── resources
項番
説明
(12)

Viewを構築するテンプレートファイル(JSPなど)を格納するディレクトリ。

(13)
エラー画面を表示するためのJSP及びHTMLを格納するディレクトリ。
作成時点では、アプリケーション実行時に発生する可能性があるエラーに対応するJSP(HTML)が格納されている。
アプリケーションの要件(UI規約など)にあわせて必ず修正すること。
(14)
インクルード用の共通JSPファイル。
このファイルは、全てのJSPファイルの先頭にインクルードされる。
インクルード用の共通JSPファイルについては、「インクルード用の共通JSPの作成」を参照されたい。
(15)

共通化するJSPファイルを格納する格納するディレクトリ。

(16)

Welcomeページを表示するJSPファイル。

(17)

Webアプリケーションの構成定義ファイル。

(18)

静的なリソースファイルを格納するディレクトリ。

このディレクトリは、リクエストの内容によって応答する内容がかわらないファイルを格納する。
具体的には以下のファイルを格納する。
  • JavaScriptファイル

  • CSSファイル

  • 画像ファイル

  • HTMLファイル

Spring MVCが提供する静的リソースの管理メカニズムを適用しやすくするために、専用のディレクトリを設ける構成を採用している。

(19)

アプリケーション全体に適用する画面スタイルを定義するCSSファイル。


3.1.4.3. domainモジュールの構成

ドメイン層のコンポーネントを管理するモジュールの構成について説明する。

[artifactId]-domain
    ├── pom.xml  ... (1)
項番
説明
(1)

domainモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。

  • 依存ライブラリとビルド用プラグインの定義

  • jarファイルを作成するための定義


└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── project
    │   │               ├── domain  ... (2)
    │   │               │   ├── model
    │   │               │   ├── repository
    │   │               │   └── service
    │   │               └── config
    │   │                   └── app
    │   │                         ├── [artifactId]CodeListConfig.java  ... (4)
    │   │                         ├── [artifactId]DomainConfig.java  ... (5)
    │   │                         └── [artifactId]InfraConfig.java  ... (6)
    │   └── resources
    │       └── META-INF
    │           └── spring  ... (3)
項番
説明
(2)

ドメイン層のクラスを格納するためのパッケージ。

(3)

Spring Frameworkのプロパティファイルを格納するディレクトリ。

(4)

コードリストを定義するためのBean定義ファイル。

(5)

ドメイン層のコンポーネントを定義するためのBean定義ファイル。

このファイルには、以下のBeanを定義する。

  • ドメイン層のコンポーネント(Service, Repositoryなど)

  • インフラストラクチャ層のコンポーネント(インフラストラクチャ層のコンポーネントが定義されているBean定義ファイルをimportする)

  • Spring Frameworkから提供されているトランザクション管理用のコンポーネント

(6)

インフラストラクチャ層のコンポーネントを定義するためのBean定義ファイル。

このファイルには、O/R MapperなどのBean定義を行う。


└── test
    └── java
        └── com
            └── example
                └── project
                    ├── domain
                    │   ├── repository
                    │   └── service
                    └── config
                        └── TestContextConfig.java  ... (7)
項番
説明
(7)

ドメイン層のユニットテスト用のコンポーネントを定義するためのBean定義ファイル。


MyBatis3用のプロジェクトを作成した場合

└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── project
    │   │               ├── domain
    │   │               └── config
    │   │                   └── mybatis
    │   │                       └── MybatisConfig.java  ... (9)
    │   └── resources
    │       ├── META-INF
    │       │   └── spring
   (...)
    │       └── com
    │           └── example
    │               └── project
    │                   └── domain
    │                       └── repository  ... (10)
    │                           └── sample
    │                               └── SampleRepository.xml  ... (11)
項番
説明
(8)

MyBatis3の設定ファイルを格納するディレクトリ。

(9)

MyBatis3の設定ファイル。

作成時点では、いくつかの推奨設定が定義されている。

(10)

MyBatis3のMapperファイルを格納するディレクトリ。

(11)
MyBatis3のMapperファイルのサンプルファイル。
Maven Archetypeで作成したプロジェクトでは、サンプル実装がコメントアウトされた状態になっている。
実際のアプリケーション開発で使用することは想定していないので、基本的にはこのファイルは削除すること。

3.1.4.4. envモジュールの構成

環境依存性をもつ設定ファイルを管理するモジュールの構成について説明する。

[artifactId]-env
    ├── configs  ... (1)
    │   ├── production-server  ... (2)
    │   │   ├── java
    │   │   └── resources
    │   └── test-server
    │       ├── java
    │       └── resources
    ├── pom.xml  ... (3)
項番
説明
(1)

環境依存する設定ファイルを管理するためのディレクトリ。

環境毎にサブディレクトリを作成し、環境依存する設定ファイルを管理する。

(2)

環境毎の設定ファイルを管理するためのディレクトリ。

作成時点では、最もシンプルな構成として、以下のディレクトリ(雛形のディレクトリ)が用意されている。

  • production-server (商用環境向けの設定ファイルを格納するディレクトリ)

  • test-server (テスト環境向けの設定ファイルを格納するディレクトリ)

(3)

envモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。

  • 依存ライブラリとビルド用プラグインの定義

  • 環境毎のjarファイルを作成するためのProfileの定義


└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── project
        │               └── config
        │                   └── app
        │                       └── [artifactId]EnvConfig.java  ... (5)
        └── resources  ... (4)
            ├── META-INF
            │   └── spring
            │       └── [artifactId]-infra.properties  ... (6)
            ├── database  ... (7)
            │   ├── H2-dataload.sql
            │   └── H2-schema.sql
            └── logback.xml  ... (8)
項番
説明
(4)

開発用の設定ファイルを管理するためのディレクトリ。

(5)

環境依存するコンポーネントを定義するBean定義ファイル。

このファイルには、以下のBeanを定義する。

  • データソース

  • 共通ライブラリから提供しているClockFactory(環境によって異なる実装を使用する場合)

  • Spring Frameworkから提供されているトランザクション管理用のコンポーネント (環境によって異なる実装を使用する場合)

(6)

環境依存する設定値を定義するプロパティファイル。

作成時点では、データソースの設定値(接続情報とコネクションプールの設定値)が定義されている。

(7)
インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ。
このディレクトリは、ちょっとした動作検証を行う時のために用意しているディレクトリである。
実際のアプリケーション開発で使用することは想定していないので、基本的にはこのディレクトリは削除すること。
(8)

Logback(ログ出力)の設定ファイル。

ログ出力については、「ロギング」を参照されたい。


3.1.4.5. initdbモジュールの構成

データベースを初期化するためのSQLファイルを管理するモジュールの構成について説明する。

[artifactId]-initdb
    ├── pom.xml  ... (1)
    └── src
        └── main
            └── sqls  ... (2)
項番
説明
(1)

initdbモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。

作成時点では、PostgreSQL用の雛形設定が定義されている。

(2)

データベースを初期化するためのSQLファイルを格納するためのディレクトリ。

作成時点では、空のディレクトリである。
作成例については、サンプルアプリケーションのinitdbプロジェクトを参照されたい。

Note

SQL Maven Pluginsql:executeを使用して、SQLを実行できる。

mvn sql:execute

3.1.4.6. seleniumモジュールの構成

Seleniumを使用したE2E(End To End)テスト用のコンポーネントを管理するモジュールの構成について説明する。

[artifactId]-selenium
    ├── pom.xml  ... (1)
    └── src
        └── test  ... (2)
            ├── java
            │   └── com
            │       └── example
            │           ├── project
            │           │   └── selenium
            │           │       └── welcome
            │           │           └── HelloIT.java  ... (3)
            │           └── config
            │               └── SeleniumContextConfig.java  ... (5)
            └── resources
                └── META-INF
                    └── spring
                        └── selenium.properties  ... (4)
項番
説明
(1)

seleniumモジュールの構成を定義するPOM(Project Object Model)ファイル。

このファイルでは、以下の定義を行う。

  • 依存ライブラリとビルド用プラグインの定義

  • jarファイルを作成するための定義

(2)

テスト用のコンポーネントと設定ファイルを格納するディレクトリ。

作成例については、共通ライブラリのテストアプリケーションのseleniumプロジェクトを参照されたい。

(3)

Selenium WebDriverを使用したサンプルテストクラス。

作成時点では、Welcomeページのタイトルを検証するテストケースが実装されている。

(4)

テストで使用する設定値を定義するプロパティファイル。

作成時点では、アプリケーションサーバのURLはhttp://localhost:8080/である。

(5)

テスト用のコンポーネントを定義するためのBean定義ファイル。

作成時点では、サンプルのテストを実行するために必要な設定がされている。


3.1.5. Appendix

3.1.5.1. プロジェクトの階層構造

Maven Archetypeで作成したプロジェクトのプロジェクト階層の構造を以下に示す。

../_images/CreateWebApplicationProjectHierarchicalStructure.png
項番
説明
(1)

Maven Archetypeで作成したプロジェクト。

Maven Archetypeで作成したプロジェクトはマルチモジュール構成となっており、親プロジェクトと各サブモジュールは相互参照の関係になっている。

version 1.10.0.RELEASE用のMaven Archetypeで作成したプロジェクトでは、親プロジェクトとして「org.terasoluna.gfw:terasoluna-gfw-parent:5.9.0.RELEASE」を指定している。

(2)

TERASOLUNA Server Framework for Java (5.x) Parentプロジェクト。

TERASOLUNA Server Framework for Java (5.x) Parentプロジェクトでは、

  • ビルド用のプラグインの設定

  • Spring Boot経由で管理されているライブラリのカスタマイズ(バージョンの調整)

  • Spring Bootで管理されていない推奨ライブラリのバージョン管理

を行っている。

なお、Spring Boot経由で依存ライブラリのバージョンを管理するために、本プロジェクトの<dependencyManagement>に「Spring Boot Dependencies」をインポートしている。

利用しているSpring Bootのバージョンは利用するOSSのバージョン参照のこと。

(3)

Spring Boot Dependenciesプロジェクト。

Tip

version 1.6.1.RELEASEより、Spring Bootの<dependencyManagement>をインポートする構成に変更しており、推奨ライブラリのバージョン管理をSpring Bootに委譲するスタイルを採用している。

Warning

version 1.6.1.RELEASEより、Spring Bootの<dependencyManagement>をインポートする構成に変更したため、子プロジェクトからライブラリのバージョンを管理するためのプロパティにアクセスする事が出来なくなっている。

そのため、子プロジェクト側でプロパティ値を参照又は上書きしている場合は、version 1.0.xからバージョンアップする際にpomファイルの修正が必要になる。

なお、Spring Bootで管理していない推奨ライブラリ(Macchinetta Server Framework (1.x)独自の推奨ライブラリ)については、従来通りバージョンを管理するためのプロパティにアクセスする事ができる。


3.1.5.2. アプリケーションコンテキストの構成とBean定義ファイルの関係

Spring Frameworkのアプリケーションコンテキスト(DIコンテナ)の構成とBean定義ファイルの関係を以下に示す。

../_images/CreateWebApplicationProjectApplicationContext.png
項番
説明
(1)

Webアプリケーション用のアプリケーションコンテキスト。

上記図で示す通り、

  • [artifactId]-web/src/main/java/com/example/project/config/app/ApplicationContextConfig.java

  • [artifactId]-domain/src/main/java/com/example/project/config/app/[artifactId]DomainConfig.java

  • [artifactId]-domain/src/main/java/com/example/project/config/app/[artifactId]InfraConfig.java

  • [artifactId]-env/src/main/java/com/example/project/config/app/[artifactId]EnvConfig.java

  • [artifactId]-domain/src/main/java/com/example/project/config/app/[artifactId]CodelistConfig.java

  • [artifactId]-web/src/main/java/com/example/project/config/app/SpringSecurityConfig.java

で定義したコンポーネントがWebアプリケーション用のアプリケーションコンテキスト(DIコンテナ)に登録される。

Webアプリケーション用のアプリケーションコンテキストに登録されているコンポーネントは、各DispatcherServlet用のアプリケーションコンテキストから参照する事ができる仕組みとなっている。

(2)

DispatcherServlet用のアプリケーションコンテキスト。

上記図で示す通り、

  • [artifactId]-web/src/main/java/com/example/project/config/web/SpringMvcConfig.java

で定義したコンポーネントがDispatcherServlet用のアプリケーションコンテキスト(DIコンテナ)に登録される。

DispatcherServlet用のアプリケーションコンテキストに存在しないコンポーネントは、Webアプリケーション用のアプリケーションコンテキスト(親コンテキスト)を参照して取得する仕組みになっているため、ドメイン層のコンポーネントをアプリケーション層のコンポーネントに対してインジェクションする事ができる。

Note

同じコンポーネントを両方のアプリケーションコンテキストに登録した時の動作について

Webアプリケーション用のアプリケーションコンテキストとDispatcherServlet用のアプリケーションコンテキストの両方に同じコンポーネントが登録されている場合は、同じアプリケーションコンテキスト(DispatcherServlet用のアプリケーションコンテキスト)内に登録されているコンポーネントがインジェクションされる点を補足しておく。

特に、ドメイン層のコンポーネント(ServiceやRepositoryなど)をDispatcherServlet用のアプリケーションコンテキストに登録しないように注意する必要である。

ドメイン層のコンポーネントをDispatcherServlet用のアプリケーションコンテキストに登録してしまうと、トランザクション制御を行うコンポーネント(AOP)が有効にならないため、データベースへの操作がコミットされない不具合が発生してしまう。

なお、Maven Archetypeで作成したプロジェクトでは、上記のような現象は発生しないように設定が行われている。設定の追加又は変更を行う場合は、注意してほしい。


3.1.5.3. オフライン環境におけるアプリケーション開発

開発プロジェクトの作成」では、マルチプロジェクト構成の開発プロジェクトを、Maven Archetype Pluginarchetype:generateを使用して作成する方法について述べた。
Mavenはオンライン環境での動作が前提であるが、以下にオフライン環境でも使用できるようにする方法について述べる。

オフライン環境でプロジェクト開発を続けるためには、開発に必要となるライブラリやプラグイン等のファイルを事前にコピーする必要がある。
以下の作業はオンライン環境で行うこと。

開発プロジェクトのルートディレクトリへ移動する。
ここでは「開発プロジェクトの作成」で作成したプロジェクトを例に説明をする。
cd C:\work\todo

プロジェクト開発に必要であるライブラリやプラグイン等のファイルをコピーする。
Maven Archetype Plugindependency:go-offlineを実行することでコピーする。
なお、dependency:go-offlineのみではマルチプロジェクトの依存関係を解決できずビルドに失敗するため、packageを指定している。
mvn package dependency:go-offline -Dmaven.repo.local=repository

パラメータ

説明

--Dmaven.repo.local

コピー先を指定する。 コピー先が存在しない場合は新たに作成される。 今回はコピー先をrepositoryと指定している。


ビルドが成功した場合、以下のようなログが出力される。

(omitted)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Macchinetta Server Framework (1.x) Web Blank Multi Project (JavaConfig)(JSP)(MyBatis3) 1.0.0-SNAPSHOT:
[INFO]
[INFO] Macchinetta Server Framework (1.x) Web Blank Mult (JavaConfig)(JSP)(MyBatis3) SUCCESS [01:00 min]
[INFO] todo-env ........................................... SUCCESS [01:01 min]
[INFO] todo-domain ........................................ SUCCESS [ 26.306 s]
[INFO] todo-web ........................................... SUCCESS [ 17.948 s]
[INFO] todo-initdb ........................................ SUCCESS [  8.104 s]
[INFO] todo-selenium ...................................... SUCCESS [ 52.715 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  04:07 min
[INFO] Finished at: 2023-07-11T15:38:18+09:00
[INFO] ------------------------------------------------------------------------

以上で、プロジェクト開発に必要なライブラリやプラグイン等のファイルをコピーした。このrepositoryをオフライン環境マシンの${HOME}/.m2へコピーすることで、作業は完了となる。
オンライン環境で一度も実行していない処理をオフライン環境で実行すると、必要なライブラリやプラグイン等のファイルを取得できず処理に失敗するが、コピーを行ったことにより、オフライン環境へ移行した場合においても継続して開発を進めることが可能となる。

Warning

オフライン環境での開発における注意点

オフライン環境では新規に依存関係をインターネットから取得することが不可能となるため、POM(Project Object Model)ファイルを編集しないこと。

POMファイルに編集を加える場合は、再度オンライン環境へ戻る必要がある。