3.1. Webアプリケーション向け開発プロジェクトの作成¶
本節では、Webアプリケーション向けの開発プロジェクトを作成する方法について説明する。
本ガイドラインでは、マルチプロジェクト構成を採用することを推奨している。 推奨するマルチプロジェクト構成の説明については、「プロジェクト構成」を参照されたい。
3.1.1. ブランクプロジェクトの種類¶
ブランクプロジェクトは、使用用途に応じて以下の2種類を提供している。 (いずれのブランクプロジェクトも、ViewにはThymeleafを用いる設定になっている。)
種別 | 使用用途 |
---|---|
商用環境にリリースするような本格的なアプリケーションを開発する際に使用する。 プロジェクトの雛形は、MavenのArchetypeとして、以下の1種類を用意している。
本ガイドラインでは、マルチプロジェクト構成のプロジェクトを使用する事を推奨している。 |
|
POC(Proof Of Concept)、プロトタイプ、サンプルなどの簡易的なアプリケーションを作成する際に使用する。 プロジェクトの雛形は、MavenのArchetypeとして、以下の2種類を用意している。
本ガイドラインでは、各種チュートリアルについてシングルプロジェクトを使用して行う手順となっている。 |
3.1.2. 開発プロジェクトの作成¶
マルチプロジェクト構成の開発プロジェクトを、 Maven Archetype Plugin の archetype:generate を使用して作成する。
Note
前提条件
以降の説明では、
- Maven (
mvn
コマンド)が使用可能であること - インターネットに繋がっていること
- インターネットにプロキシ経由で繋ぐ場合は、Mavenのプロキシ設定 が行われていること
を前提としている。
前提条件が整っていない場合は、まずこれらのセットアップを行ってほしい。
マルチプロジェクトを作成するためのArchetypeとして、以下の1種類を用意している。
項番 | Archetype(ArtifactId) | 説明 |
---|---|---|
macchinetta-multi-web-blank-thymeleaf-archetype | O/R MapperとしてMyBatis3を使用するためのプロジェクトを生成するためのArchetype。 |
プロジェクトを作成するフォルダに移動する。
cd C:\work
Maven Archetype Plugin の archetype:generate を使用して、プロジェクトを作成する。
mvn archetype:generate -B^
-DarchetypeGroupId=com.github.macchinetta.blank^
-DarchetypeArtifactId=macchinetta-multi-web-blank-thymeleaf-archetype^
-DarchetypeVersion=1.5.1.RELEASE^
-DgroupId=com.example.todo^
-DartifactId=todo^
-Dversion=1.0.0-SNAPSHOT
パラメータ | 説明 |
---|---|
-B
|
batch mode (対話を省略) |
-DarchetypeGroupId
|
ブランクプロジェクトのgroupIdを指定する。(固定) |
-DarchetypeArtifactId
|
ブランクプロジェクトのarchetypeId(雛形を特定するためのID)を指定する。(カスタマイズが必要) 以下のarchetypeIdを指定する。
|
-DarchetypeVersion
|
ブランクプロジェクトのバージョンを指定する。(固定) |
-DgroupId
|
作成するプロジェクトのgroupIdを指定する。(カスタマイズが必要) 上記例では、 |
-DartifactId
|
作成するプロジェクトのartifactIdを指定する。(カスタマイズが必要) 上記例では、 |
-Dversion
|
作成するプロジェクトのバージョンを指定する。(カスタマイズが必要) 上記例では、 |
プロジェクトの作成が成功した場合、以下のようなログが出力される。 (以下は、MyBatis3用のArchetypeを使用して作成した場合の出力例)
(... omit)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: macchinetta-multi-web-blank-thymeleaf-archetype:1.5.1.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: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.example.todo
[INFO] Parameter: artifactId, Value: todo
[INFO] Parent element not overwritten in C:\work\todo\todo-env\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-domain\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-web\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-initdb\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-selenium\pom.xml
[INFO] project created from Archetype in dir: C:\work\todo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.929 s
[INFO] Finished at: 2015-07-31T12:03:21+00:00
[INFO] Final Memory: 10M/26M
[INFO] ------------------------------------------------------------------------
プロジェクトの作成が成功した場合、Mavenのマルチプロジェクトが作成される。 Maven Archetypeで作成したプロジェクトの詳細な説明については、「開発プロジェクトの構成」を参照されたい。
todo
├── pom.xml
├── todo-domain
├── todo-env
├── todo-initdb
├── todo-selenium
└── todo-web
3.1.3. 開発プロジェクトのカスタマイズ¶
Maven Archetypeで作成したプロジェクトには、アプリケーション毎にカスタマイズが必要な箇所がいくつか存在する。
カスタマイズが必要な箇所を以下に示す。
Note
上記以外のカスタマイズポイントとしては、
- 認証・認可 の設定
- ファイルアップロード を有効化するための設定
- 国際化 を有効化するための設定
- ロギング の定義
- 例外ハンドリング の定義
- RESTful Web Service 向けの設定の適用
などがある。
これらのカスタマイズについては、各節のHow to useを参照し、必要に応じてカスタマイズしてほしい。
Note
以降の説明でartifactId
と表現している部分は、
プロジェクト作成時に指定したartifactId
に置き換えて読み進めてほしい。
3.1.3.1. POMファイルのプロジェクト情報¶
Maven Archetypeで作成したプロジェクトのPOMファイルでは、
- プロジェクト名(
name
要素) - プロジェクト説明(
description
要素) - プロジェクトURL(
url
要素) - プロジェクト創設年(
inceptionYear
要素) - プロジェクトライセンス(
licenses
要素) - プロジェクト組織(
organization
要素)
といったプロジェクト情報が、Archetype自身のプロジェクト情報が設定されている状態となっている。 実際の設定内容を以下に示す。
<!-- ... -->
<name>Macchinetta Server Framework (1.x) Web Blank Multi Project</name>
<description>Web Blank Multi Project 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>
<developers>
<developer>
<name>Macchinetta</name>
<organization>Macchinetta</organization>
<organizationUrl>http://macchinetta.github.io</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git@github.com:Macchinetta/macchinetta-web-multi-blank-thymeleaf.git</connection>
<developerConnection>scm:git:git@github.com:Macchinetta/macchinetta-web-multi-blank-thymeleaf</developerConnection>
<url>git@github.com:Macchinetta/macchinetta-web-multi-blank-thymeleaf</url>
</scm>
<!-- ... -->
Note
プロジェクト情報には、適切な値を設定すること。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
マルチプロジェクト全体の構成を定義するPOM(Project Object Model)ファイル
|
プロジェクト情報に適切な値を指定する。 |
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.
[HTML]
<div class="error">
<span th:text="${#strings.isEmpty(exceptionCode)} ? #{e.xx.fw.5001} : |[${exceptionCode}] #{e.xx.fw.5001}|">[e.xx.fw.5001]
Resource not found.</span>
</div>
[applicationContext.xml]
<bean id="exceptionCodeResolver"
class="org.terasoluna.gfw.common.exception.SimpleMappingExceptionCodeResolver">
<!-- ... -->
<entry key="ResourceNotFoundException" value="e.xx.fw.5001" />
<!-- ... -->
</bean>
x.xx.fw.9999
形式のメッセージIDは、
本ガイドラインの「メッセージ管理」で紹介しているメッセージID体系であるが、
プロジェクト区分の値が暫定値「xx
」の状態になっている。
Note
- 本ガイドラインで紹介しているメッセージID体系を利用する場合は、プロジェクト区分に適切な値を指定すること。 本ガイドラインで紹介しているメッセージID体系については、「結果メッセージ」を参照されたい。
- 本ガイドラインで紹介しているメッセージID体系を利用しない場合は、以下に示す修正対象ファイル内で使用しているメッセージIDを全て置き換える必要がある。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「xx 」を、適切な値に修正する。 |
|
エラー画面用のテンプレートHTML
|
<div> 要素のth:text 属性に指定しているメッセージIDのプロジェクト区分の暫定値「xx 」を、適切な値に修正する。 |
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル
|
BeanIDがexceptionCodeResolver のBean定義内で指定している例外コード(メッセージID)のプロジェクト区分の暫定値「xx 」を、適切な値に修正する。 |
3.1.3.3. メッセージ文言¶
Maven Archetypeで作成したプロジェクトでは、いくつかのメッセージ定義を提供しているが、 メッセージ文言は簡易的なメッセージになっている。 実際のメッセージ(サンプリング)を以下に示す。
[application-messages.properties]
e.xx.fw.5001 = Resource not found.
# ...
# typemismatch
typeMismatch="{0}" is invalid.
# ...
Note
メッセージ文言については、アプリケーション要件(メッセージ規約など)に合わせて修正すること。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
アプリケーション要件に応じたメッセージに修正する。 入力チェックでエラーとなった際に表示するメッセージ(Bean Validationのメッセージ)についても、 アプリケーション要件に応じて修正(デフォルトメッセージの上書き)が必要になる。 デフォルトメッセージの上書き方法については、「エラーメッセージの定義」を参照されたい。 |
3.1.3.4. エラー画面¶
Maven Archetypeで作成したプロジェクトでは、エラーの種類毎にエラー画面を表示するためのテンプレートHTML及び静的なHTMLを提供しているが、
- 画面レイアウト
- 画面タイトル
- メッセージの文言
などが簡易的な実装になっている。実際のテンプレートHTMLの実装(サンプリング)を以下に示す。
[HTML]
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Resource Not Found Error!</title>
<link rel="stylesheet"
href="../../../../resources/app/css/styles.css" th:href="@{/resources/app/css/styles.css}">
</head>
<body>
<div id="wrapper">
<h1>Resource Not Found Error!</h1>
<div class="error">
<span th:text="${#strings.isEmpty(exceptionCode)} ? #{e.xx.fw.5001} : |[${exceptionCode}] #{e.xx.fw.5001}|">[e.xx.fw.5001]
Resource not found.</span>
</div>
<div th:if="${resultMessages} != null" class="alert alert-error" th:class="|alert alert-${resultMessages.type}|">
<ul>
<li th:each="message : ${resultMessages}"
th:text="${message.code} != null ? ${#messages.msgWithParams(message.code, message.args)} : ${message.text}">error
detail message</li>
</ul>
</div>
<br>
<!-- ... -->
<br>
</div>
</body>
</html>
Note
エラー画面を表示するためのテンプレートHTML及び静的なHTMLについては、アプリケーション要件(UI規約など)に合わせて修正すること。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
エラー画面用のテンプレートHTML
|
アプリケーション要件(UI規約など)に合わせて修正する。 エラー画面を表示するテンプレートHTMLをカスタマイズする際は、「例外ハンドリング の コーディングポイント(Thymeleaf編)」を参照されたい。 |
|
エラー画面用の静的なHTML
|
アプリケーション要件(UI規約など)に合わせて修正する。 |
3.1.3.6. インメモリデータベース(H2 Database)¶
Maven Archetypeで作成したプロジェクトには、インメモリデータベース(H2 Database)をセットアップするための設定が行われているが、 これはちょっとした動作検証(プロトタイプ作成やPOC(Proof Of Concept))を行うための設定である。 そのため、本格的なアプリケーション開発を行う場合は、不要な設定になる。
[artifactId-env.xml]
<jdbc:initialize-database data-source="dataSource"
ignore-failures="ALL">
<jdbc:script location="classpath:/database/${database}-schema.sql" encoding="UTF-8" />
<jdbc:script location="classpath:/database/${database}-dataload.sql" encoding="UTF-8" />
</jdbc:initialize-database>
└── src
└── main
└── resources
├── META-INF
(...)
├── database
│ ├── H2-dataload.sql
│ └── H2-schema.sql
Note
本格的なアプリケーション開発を行う場合は、インメモリデータベース(H2 Database)をセットアップするための定義とSQLを管理するためのディレクトリを削除すること。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
環境依存するコンポーネントを定義するBean定義ファイル
|
<jdbc:initialize-database> 要素を削除する。 |
|
インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ
|
ディレクトリを削除する。 |
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 IO Platformで定義済みである。
[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-env.xml]
<bean id="realDataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${database.driverClassName}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="defaultAutoCommit" value="false" />
<property name="maxTotal" value="${cp.maxActive}" />
<property name="maxIdle" value="${cp.maxIdle}" />
<property name="minIdle" value="${cp.minIdle}" />
<property name="maxWaitMillis" value="${cp.maxWait}" />
</bean>
Note
本格的なアプリケーション開発を行う場合は、アプリケーション稼働時に利用するデータベースにアクセスするためのデータソース設定に変更すること。
Maven Archetypeで作成したプロジェクトでは、Apache Commons DBCPを使用する設定となっているが、 アプリケーションサーバから提供されているデータソースを使用して、 JNDI(Java Naming and Directory Interface)経由でデータソースにアクセスする方法を採用するケースも多い。
開発環境ではApache Commons DBCPのデータソースを使用して、 テスト環境及び商用環境ではアプリケーションサーバから提供されているデータソースを使用するといった使い分けを行うケースもある。
データソースの設定方法については、「データベースアクセス(共通編) の データソースの設定」を参照されたい。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 | 対象ファイル | カスタマイズ方法 |
---|---|---|
POMファイル
|
インメモリデータベース(H2 Database)のJDBCドライバを依存ライブラリから削除する。 アプリケーション稼働時に利用するデータベースにアクセスするためのJDBCドライバを依存ライブラリに追加する。 |
|
環境依存する設定値を定義するプロパティファイル
|
データソースとしてApache Commons DBCPを使用する場合は、以下のプロパティにアプリケーション稼働時に利用するデータベースにアクセスするための接続情報を指定する。
アプリケーションサーバから提供されているデータソースを使用する場合は、以下のプロパティ以外は不要なプロパティになるので削除する。
|
|
環境依存するコンポーネントを定義するBean定義ファイル
|
アプリケーションサーバから提供されているデータソースを使用する場合は、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.jdbc</groupId> --> <!-- <artifactId>ojdbc7</artifactId> --> <!-- <version>${ojdbc.version}</version> --> <!-- </dependency> --> <!-- ... --> <postgresql.version>9.4.1212</postgresql.version> <ojdbc.version>12.1.0.2</ojdbc.version>
artifactId/artifactId-web/pom.xml
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope><!-- (1) --> </dependency> <!-- <dependency> --> <!-- <groupId>com.oracle.jdbc</groupId> --> <!-- <artifactId>ojdbc7</artifactId> --> <!-- <scope>runtime</scope> --> <!-- </dependency> -->
項番 | 説明 |
---|---|
(1)
|
JDBCドライバはコンパイルには使用せず、アプリケーション実行時のみ使用するため、 単体テストで使用する場合などは、適切なスコープに変更して使用されたい。 |
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とテンプレートHTML
- エラー画面を表示するためのControllerとテンプレートHTML
- Thymeleafのテンプレートレイアウト用のHTML
- アプリケーション全体の画面スタイルを定義するCSSファイル
などが提供されている。
Warning
簡易実装として提供しているコンポーネントの扱いについて
簡易実装として提供しているコンポーネントは、以下のいずれかの対応を行うこと。
- アプリケーション要件にあわせて修正
- 不要なコンポーネントは削除
Note
REST API用のプロジェクトを作成する場合の手順について
Maven Archetypeで作成したプロジェクトは、 伝統的なWebアプリケーション(リクエストパラメータを受け取ってHTMLを応答するアプリケーション)を構築する際に必要となる推奨設定が行われている。
そのため、JSONやXMLを扱うREST APIを構築する際には不要な設定が存在する。 REST APIを構築するためのプロジェクトを作成する場合は、「RESTful Web Service の アプリケーションの設定」を参照し、 REST API向けの設定を適用してほしい。
Note
以降の説明でartifactId
と表現している部分は、
プロジェクト作成時に指定したartifactId
に置き換えて読み進めてほしい。
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層)のコンポーネントを管理するモジュール。 このモジュールでは、主に以下のコンポーネントやファイルを管理する。
|
(3)
|
ドメイン層のコンポーネントを管理するモジュール。 このモジュールでは、主に以下のコンポーネントやファイルを管理する。
|
(4)
|
環境依存性をもつ設定ファイルを管理するモジュール。 このモジュールでは、主に以下のファイルを管理する。
|
(5)
|
データベースを初期化するためのSQLファイルを管理するモジュール このモジュールでは、主に以下のファイルを管理する。
|
(6)
|
Seleniumを使用したE2Eテスト用のコンポーネントを管理するモジュール。 このモジュールでは、主に以下のファイルを管理する。
|
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クラス、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)ファイル。 このファイルでは、以下の定義を行う。
|
Note
REST API用のプロジェクトを作成する際のwebモジュールのモジュール名について
REST APIを構築する場合は、モジュール名をartifactId-api
といった感じの名前にしておくと、
アプリケーションの種類が識別しやすくなる。
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ └── app ... (2)
│ │ ├── common
│ │ │ └── error
│ │ │ └── CommonErrorController.java ... (3)
│ │ └── welcome
│ │ └── HelloController.java ... (4)
│ ├── resources
│ │ ├── META-INF
│ │ │ ├── dozer ... (5)
│ │ │ └── spring ... (6)
│ │ │ ├── application.properties ... (7)
│ │ │ ├── applicationContext.xml ... (8)
│ │ │ ├── spring-mvc.xml ... (9)
│ │ │ └── spring-security.xml ... (10)
│ │ └── i18n ... (11)
│ │ └── application-messages.properties ... (12)
項番
|
説明
|
---|---|
(2)
|
アプリケーション層のクラスを格納するためのパッケージ。 REST APIを構築する場合は、パッケージ名を |
(3)
|
エラー画面を表示するためのControllerクラス。 |
(4)
|
Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。 |
(5)
|
Dozer(Bean Mapper)のマッピング定義ファイルを格納するディレクトリ。 Dozerについては、「Beanマッピング(Dozer)」を参照されたい。 作成時点では空のディレクトリである。 マッピングファイルが必要になった場合(高度なマッピングが必要になった場合)は、 このディレクトリ配下に格納すると、自動的にマッピングファイルが読み込まれる。 Note このディレクトリには、以下のファイルを格納する。
ドメイン層のJavaBean同士のマッピングはドメイン層のディレクトリに格納することを推奨している。 |
(6)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(7)
|
アプリケーション層で使用する設定値を定義するプロパティファイル。 作成時点では、空のファイルである。 |
(8)
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(9)
|
このファイルには、以下のBeanを定義する。
REST APIを構築する場合は、ファイル名を |
(10)
|
Spring Securityのコンポーネントを定義するためのBean定義ファイル。 このファイルは、Webアプリケーション用のアプリケーションコンテキストを作成する際に読み込む。 |
(11)
|
アプリケーション層で使用するメッセージ定義ファイルを格納するディレクトリ。 |
(12)
|
アプリケーション層で使用するメッセージを定義するプロパティファイル。 作成時点では、いくつかの汎用的なメッセージが定義されている。 Note メッセージについては、アプリケーションの要件(メッセージ規約など)にあわせて必ず修正すること。 メッセージ定義については、「メッセージ管理」を参照されたい。 |
Note
アプリケーションコンテキストとBean定義ファイルの関連については、 「アプリケーションコンテキストの構成とBean定義ファイルの関係」を参照されたい。
│ └── webapp
│ ├── WEB-INF
│ │ ├── views ... (13)
│ │ │ ├── common
│ │ │ │ └── error ... (14)
│ │ │ │ ├── accessDeniedError.html
│ │ │ │ ├── businessError.html
│ │ │ │ ├── dataAccessError.html
│ │ │ │ ├── invalidCsrfTokenError.html
│ │ │ │ ├── missingCsrfTokenError.html
│ │ │ │ ├── resourceNotFoundError.html
│ │ │ │ ├── systemError.html
│ │ │ │ ├── transactionTokenError.html
│ │ │ │ └── unhandledSystemError.html
│ │ │ ├── layout ... (15)
│ │ │ │ ├── header.html
│ │ │ │ └── template.html
│ │ │ └── welcome
│ │ │ └── home.html ... (16)
│ │ └── web.xml ... (17)
│ └── resources ... (18)
│ └── app
│ └── css
│ └── styles.css ... (19)
└── test
├── java
└── resources
項番
|
説明
|
---|---|
(13)
|
Viewを構築するテンプレートファイル(HTMLなど)を格納するディレクトリ。 |
(14)
|
エラー画面を表示するためのテンプレートHTML及び静的なHTMLを格納するディレクトリ。 作成時点では、アプリケーション実行時に発生する可能性があるエラーに対応するテンプレートHTML及び静的なHTMLが格納されている。 Note エラー画面用のテンプレートHTML及び静的なHTMLについては、アプリケーションの要件(UI規約など)にあわせて必ず修正すること。 |
(15)
|
Thymeleafのテンプレートレイアウト用のHTMLファイルを格納するディレクトリ。 Thymeleafのテンプレートレイアウト用のHTMLファイルの記載内容については、「Thymeleafにおける画面レイアウト」を参照されたい。 |
(16)
|
Welcomeページを表示するテンプレートHTMLファイル。 |
(17)
|
Webアプリケーションの構成定義ファイル。 |
(18)
|
静的なリソースファイルを格納するディレクトリ。 このディレクトリは、リクエストの内容によって応答する内容がかわらないファイルを格納する。 具体的には以下のファイルを格納する。
Spring MVCが提供する静的リソースの管理メカニズムを適用しやすくするために、 専用のディレクトリを設ける構成を採用している。 |
(19)
|
アプリケーション全体に適用する画面スタイルを定義するCSSファイル。 |
3.1.4.3. domainモジュールの構成¶
ドメイン層のコンポーネントを管理するモジュールの構成について説明する。
artifactId-domain
├── pom.xml ... (1)
項番
|
説明
|
---|---|
(1)
|
domainモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。
|
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ └── domain ... (2)
│ │ ├── model
│ │ ├── repository
│ │ └── service
│ └── resources
│ └── META-INF
│ ├── dozer ... (3)
│ └── spring ... (4)
│ ├── artifactId-codelist.xml ... (5)
│ ├── artifactId-domain.xml ... (6)
│ └── artifactId-infra.xml ... (7)
項番
|
説明
|
---|---|
(2)
|
ドメイン層のクラスを格納するためのパッケージ。 |
(3)
|
Dozer(Bean Mapper)のマッピング定義ファイルを格納するディレクトリ。 Dozerについては、「Beanマッピング(Dozer)」を参照されたい。 作成時点では空のディレクトリである。 マッピングファイルが必要になった場合(高度なマッピングが必要になった場合)は、 このディレクトリ配下に格納すると、自動的にマッピングファイルが読み込まれる。 Note このディレクトリには、以下のファイルを格納する。
|
(4)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(5)
|
コードリストを定義するためのBean定義ファイル。 |
(6)
|
ドメイン層のコンポーネントを定義するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(7)
|
インフラストラクチャ層のコンポーネントを定義するためのBean定義ファイル。 このファイルには、O/R MapperなどのBean定義を行う。 |
└── test
├── java
│ └── com
│ └── example
│ └── project
│ └── domain
│ ├── repository
│ └── service
└── resources
└── test-context.xml ... (8)
項番
|
説明
|
---|---|
(8)
|
ドメイン層のユニットテスト用のコンポーネントを定義するためのBean定義ファイル。 |
MyBatis3用のプロジェクトを作成した場合
└── src
├── main
│ ├── java
(...)
│ └── resources
│ ├── META-INF
│ │ ├── dozer
│ │ ├── mybatis ... (9)
│ │ │ └── mybatis-config.xml ... (10)
│ │ └── spring
(...)
│ └── com
│ └── example
│ └── project
│ └── domain
│ └── repository ... (11)
│ └── sample
│ └── SampleRepository.xml ... (12)
項番
|
説明
|
---|---|
(9)
|
MyBatis3の設定ファイルを格納するディレクトリ。 |
(10)
|
MyBatis3の設定ファイル。 作成時点では、いくつかの推奨設定が定義されている。 |
(11)
|
MyBatis3のMapperファイルを格納するディレクトリ。 |
(12)
|
MyBatis3のMapperファイルのサンプルファイル。 作成時点では、サンプル実装がコメントアウトされた状態になっている。 このファイルは最終的には不要なファイルである。 |
3.1.4.4. envモジュールの構成¶
環境依存性をもつ設定ファイルを管理するモジュールの構成について説明する。
artifactId-env
├── configs ... (1)
│ ├── production-server ... (2)
│ │ └── resources
│ └── test-server
│ └── resources
├── pom.xml ... (3)
項番
|
説明
|
---|---|
(1)
|
環境依存する設定ファイルを管理するためのディレクトリ。 環境毎にサブディレクトリを作成し、環境依存する設定ファイルを管理する。 |
(2)
|
環境毎の設定ファイルを管理するためのディレクトリ。 作成時点では、最もシンプルな構成として、以下のディレクトリ(雛形のディレクトリ)が用意されている。
|
(3)
|
envモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。
|
└── src
└── main
└── resources ... (4)
├── META-INF
│ └── spring
│ ├── artifactId-env.xml ... (5)
│ └── artifactId-infra.properties ... (6)
├── database ... (7)
│ ├── H2-dataload.sql
│ └── H2-schema.sql
├── dozer.properties ... (8)
├── log4jdbc.properties ... (9)
└── logback.xml ... (10)
項番
|
説明
|
---|---|
(4)
|
開発用の設定ファイルを管理するためのディレクトリ。 |
(5)
|
環境依存するコンポーネントを定義するBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(6)
|
環境依存する設定値を定義するプロパティファイル。 作成時点では、データソースの設定値(接続情報とコネクションプールの設定値)が定義されている。 |
(7)
|
インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ。 このディレクトリは、ちょっとした動作検証を行う時のために用意しているディレクトリである。 実際のアプリケーション開発で使用することは想定していないので、基本的にはこのディレクトリは削除すること。 |
(8)
|
Dozer(Bean Mapper)のグローバル設定を行うためのプロパティファイル。 Dozerについては、「Beanマッピング(Dozer)」を参照されたい。 作成時点では、空のファイルである。(ファイルがないと起動時に警告ログが出力されるため、これを防ぐために空のファイルを用意している) |
(9)
|
Log4jdbc-remix(JDBC関連のログ出力を行うライブラリ)のグローバル設定を行うためのプロパティファイル。 Log4jdbc-remixについては、「JDBCのDebug用ログの設定」を参照されたい。 作成時点では、ログに出力するSQLの改行に関する設定のみ指定されている。 |
(10)
|
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プロジェクト を参照されたい。 |
3.1.4.6. seleniumモジュールの構成¶
Seleniumを使用したE2E(End To End)テスト用のコンポーネントを管理するモジュールの構成について説明する。
artifactId-selenium
├── pom.xml ... (1)
└── src
└── test ... (2)
├── java
│ └── com
│ └── example
│ └── project
│ └── selenium
│ └── welcome
│ └── HelloTest.java ... (3)
└── resources
└── META-INF
└── spring
├── selenium.properties ... (4)
└── seleniumContext.xml ... (5)
項番
|
説明
|
---|---|
(1)
|
seleniumモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。
|
(2)
|
テスト用のコンポーネントと設定ファイルを格納するディレクトリ。 作成例については、サンプルアプリケーションのseleniumプロジェクト を参照されたい。 |
(3)
|
Selenium WebDriverを使用したサンプルテストクラス。 作成時点では、Welcomeページのタイトルを検証するテストケースが実装されている。 |
(4)
|
テストで使用する設定値を定義するプロパティファイル。 作成時点では、アプリケーションサーバのURLは |
(5)
|
テスト用のコンポーネントを定義するためのBean定義ファイル。 作成時点では、サンプルのテストを実行するために必要な設定がされている。 |
3.1.5. Appendix¶
3.1.5.1. プロジェクトの階層構造¶
Maven Archetypeで作成したプロジェクトのプロジェクト階層の構造を以下に示す。
項番
|
説明
|
---|---|
(1)
|
Maven Archetypeで作成したプロジェクト。 Maven Archetypeで作成したプロジェクトはマルチモジュール構成となっており、 親プロジェクトと各サブモジュールは相互参照の関係になっている。 version 1.5.1.RELEASE用のMaven Archetypeで作成したプロジェクトでは、 親プロジェクトとして「org.terasoluna.gfw:terasoluna-gfw-parent:5.4.1.RELEASE」を指定している。 |
(2)
|
TERASOLUNA Server Framework for Java (5.x) Parentプロジェクト。 TERASOLUNA Server Framework for Java (5.x) Parentプロジェクトでは、
を行っている。 なお、Spring IO Platform経由で依存ライブラリのバージョンを管理するために、本プロジェクトの 利用しているSpring IO Platformのバージョンは利用するOSSのバージョン参照のこと。 |
(3)
|
Spring IO Platformプロジェクト。 親プロジェクトとして「org.springframework.boot:spring-boot-starter-parent:1.2.5.RELEASE」が指定されているため、spring-boot-starter-parentのpomファイルに定義されている |
(4)
|
Spring Boot Starter Parentプロジェクト。 親プロジェクトとして「org.springframework.boot:spring-boot-dependencies:1.2.5.RELEASE」が指定されているため、spring-boot-dependenciesのpomファイルに定義されている |
(5)
|
Spring Boot Dependenciesプロジェクト。 |
Tip
version 5.0.0.RELEASEより、Spring IO Platformの<dependencyManagement>
をインポートする構成に変更しており、
推奨ライブラリのバージョン管理をSpring IO Platformに委譲するスタイルを採用している。
Warning
version 5.0.0.RELEASEより、Spring IO Platformの<dependencyManagement>
をインポートする構成に変更したため、
子プロジェクトからライブラリのバージョンを管理するためのプロパティにアクセスする事が出来なくなっている。
そのため、子プロジェクト側でプロパティ値を参照又は上書きしている場合は、version 1.0.xからバージョンアップする際にpomファイルの修正が必要になる。
なお、Spring IO Platformで管理していない推奨ライブラリ(TERASOLUNA Server Framework for Java (5.x)独自の推奨ライブラリ)については、 従来通りバージョンを管理するためのプロパティにアクセスする事ができる。
3.1.5.2. アプリケーションコンテキストの構成とBean定義ファイルの関係¶
Spring Frameworkのアプリケーションコンテキスト(DIコンテナ)の構成とBean定義ファイルの関係を以下に示す。
項番
|
説明
|
---|---|
(1)
|
Webアプリケーション用のアプリケーションコンテキスト。 上記図で示す通り、
で定義したコンポーネントがWebアプリケーション用のアプリケーションコンテキスト(DIコンテナ)に登録される。 Webアプリケーション用のアプリケーションコンテキストに登録されているコンポーネントは、
各 |
(2)
|
上記図で示す通り、
で定義したコンポーネントが
|
Note
同じコンポーネントを両方のアプリケーションコンテキストに登録した時の動作について
Webアプリケーション用のアプリケーションコンテキストとDispatcherServlet
用のアプリケーションコンテキストの両方に同じコンポーネントが登録されている場合は、
同じアプリケーションコンテキスト(DispatcherServlet
用のアプリケーションコンテキスト)内に登録されているコンポーネントがインジェクションされる点を補足しておく。
特に、ドメイン層のコンポーネント(ServiceやRepositoryなど)をDispatcherServlet
用のアプリケーションコンテキストに登録しないように注意する必要である。
ドメイン層のコンポーネントをDispatcherServlet
用のアプリケーションコンテキストに登録してしまうと、
トランザクション制御を行うコンポーネント(AOP)が有効にならないため、データベースへの操作がコミットされない不具合が発生してしまう。
なお、Maven Archetypeで作成したプロジェクトでは、上記のような現象は発生しないように設定が行われている。 設定の追加又は変更を行う場合は、注意してほしい。
3.1.5.3. 設定ファイルの解説¶
Todo
各種設定が意味することの理解度を高めるために、設定ファイルの解説を追加する予定である。
- 機能詳細に説明があるものについては、機能詳細への参照を記載する。
- 機能詳細に記載がないものについては、ここに説明を記載する。
具体的な対応時期は未定。
3.1.5.4. オフライン環境におけるアプリケーション開発¶
「開発プロジェクトの作成」では、 マルチプロジェクト構成の開発プロジェクトを、 Maven Archetype Plugin の archetype:generate を使用して作成する方法について述べた。 Mavenはオンライン環境での動作が前提であるが、 以下にオフライン環境でも使用できるようにする方法について述べる。
オフライン環境でプロジェクト開発を続けるためには、 開発に必要となるライブラリやプラグイン等のファイルを事前にコピーする必要がある。 以下の作業は オンライン環境 で行うこと。
開発プロジェクトのルートディレクトリへ移動する。 ここでは「開発プロジェクトの作成」で作成したプロジェクトを例に説明をする。
cd C:\work\todo
プロジェクト開発に必要であるライブラリやプラグイン等のファイルをコピーする。 Maven Archetype Plugin の dependency:go-offline を実行することでコピーする。
mvn dependency:go-offline -Dmaven.repo.local=repository
パラメータ | 説明 |
---|---|
–Dmaven.repo.local
|
コピー先を指定する。 コピー先が存在しない場合は新たに作成される。 今回はコピー先をrepositoryと指定している。 |
成果物を配布しやすくするために、warファイルまたはjarファイルを作成する。 この時、ビルドに必要となるライブラリやプラグイン等のファイルがコピーされる。
mvn package -Dmaven.repo.local=repository
ビルドが成功した場合、以下のようなログが出力される。
(... omit)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Macchinetta Server Framework (1.x) Web Blank Multi Project SUCCESS [ 0.006 s]
[INFO] todo-env ........................................... SUCCESS [ 46.565 s]
[INFO] todo-domain ........................................ SUCCESS [ 0.684 s]
[INFO] todo-web ........................................... SUCCESS [ 12.832 s]
[INFO] todo-initdb ........................................ SUCCESS [ 0.067 s]
[INFO] todo-selenium ...................................... SUCCESS [01:13 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:14 min
[INFO] Finished at: 2015-10-01T10:32:34+09:00
[INFO] Final Memory: 36M/206M
[INFO] ------------------------------------------------------------------------
以上で、プロジェクト開発に必要なライブラリやプラグイン等のファイルをコピーした。 このrepositoryをオフライン環境マシンの${HOME}/.m2へコピーすることで、作業は完了となる。 オンライン環境で一度も実行していない処理をオフライン環境で実行すると、 必要なライブラリやプラグイン等のファイルを取得できず処理に失敗するが、 コピーを行ったことにより、オフライン環境へ移行した場合においても継続して開発を進めることが可能となる。
Warning
オフライン環境での開発における注意点
オフライン環境では新規に依存関係をインターネットから取得することが不可能となるため、 POM(Project Object Model)ファイルを編集しないこと。 POMファイルに編集を加える場合は、再度オンライン環境へ戻る必要がある。