3.1. Webアプリケーション向け開発プロジェクトの作成¶
本節では、Webアプリケーション向けの開発プロジェクトを作成する方法について説明する。
本ガイドラインでは、マルチプロジェクト構成を採用することを推奨している。推奨するマルチプロジェクト構成の説明については、「プロジェクト構成」を参照されたい。
3.1.1. ブランクプロジェクトの種類¶
ブランクプロジェクトは、使用用途に応じて以下の2種類を提供している。
種別 |
使用用途 |
---|---|
商用環境にリリースするような本格的なアプリケーションを開発する際に使用する。 プロジェクトの雛形は、MavenのArchetypeとして以下を用意している。
本ガイドラインでは、マルチプロジェクト構成のプロジェクトを使用する事を推奨している。 |
|
POC(Proof Of Concept)、プロトタイプ、サンプルなどの簡易的なアプリケーションを作成する際に使用する。 プロジェクトの雛形は、MavenのArchetypeとして以下を用意している。
本ガイドラインでは、各種チュートリアルについてシングルプロジェクトを使用して行う手順となっている。 |
3.1.2. 開発プロジェクトの作成¶
マルチプロジェクト構成の開発プロジェクトを、 Maven Archetype Pluginのarchetype:generateを使用して作成する。
Note
前提条件
以降の説明では、
Maven(
mvn
コマンド)が使用可能であることインターネットに繋がっていること
インターネットにプロキシ経由で繋ぐ場合は、Mavenのプロキシ設定が行われていること
を前提としている。
前提条件が整っていない場合は、まずこれらのセットアップを行ってほしい。
マルチプロジェクトを作成するためのArchetypeとして、以下を用意している。
項番 |
Archetype(ArtifactId) |
説明 |
---|---|---|
macchinetta-multi-web-blank-jsp-mybatis3-archetype |
O/R MapperとしてMyBatis3を使用するためのプロジェクトを生成するためのArchetype。 |
項番 |
Archetype(ArtifactId) |
説明 |
---|---|---|
macchinetta-multi-web-blank-thymeleaf-mybatis3-archetype |
O/R MapperとしてMyBatis3を使用するためのプロジェクトを生成するためのArchetype。 |
項番 |
Archetype(ArtifactId) |
説明 |
---|---|---|
macchinetta-multi-web-blank-xmlconfig-jsp-mybatis3-archetype |
O/R MapperとしてMyBatis3を使用するためのプロジェクトを生成するためのArchetype。 |
項番 |
Archetype(ArtifactId) |
説明 |
---|---|---|
macchinetta-multi-web-blank-xmlconfig-thymeleaf-mybatis3-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-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を指定する。
上記例では、 |
-DarchetypeVersion
|
ブランクプロジェクトのバージョンを指定する。(固定) |
-DgroupId
|
作成するプロジェクトのgroupIdを指定する。(カスタマイズが必要) 上記例では、 |
-DartifactId
|
作成するプロジェクトのartifactIdを指定する。(カスタマイズが必要) 上記例では、 |
-Dversion
|
作成するプロジェクトのバージョンを指定する。(カスタマイズが必要) 上記例では、 |
(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] ------------------------------------------------------------------------
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ファイル¶
3.1.3.1.1. プロジェクト情報¶
Maven Archetypeで作成したプロジェクトのPOMファイルでは、
プロジェクト名(
name
要素)プロジェクト説明(
description
要素)プロジェクトURL(
url
要素)プロジェクト創設年(
inceptionYear
要素)プロジェクトライセンス(
licenses
要素)プロジェクト組織(
organization
要素)
<!-- 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)ファイル
|
プロジェクト情報に適切な値を指定する。 |
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>
[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">
<!-- omitted -->
<entry key="ResourceNotFoundException" value="e.xx.fw.5001" />
<!-- omitted -->
</bean>
x.xx.fw.9999
形式のメッセージIDは、本ガイドラインの「メッセージ管理」で紹介しているメッセージID体系であるが、プロジェクト区分の値が暫定値「xx
」の状態になっている。
Note
本ガイドラインで紹介しているメッセージID体系を利用する場合は、プロジェクト区分に適切な値を指定すること。本ガイドラインで紹介しているメッセージID体系については、「結果メッセージ」を参照されたい。
本ガイドラインで紹介しているメッセージID体系を利用しない場合は、以下に示す修正対象ファイル内で使用しているメッセージIDを全て置き換える必要がある。
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「 |
|
エラー画面用のJSP
|
|
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル
|
BeanIDが |
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「 |
|
エラー画面用のThymeleafのテンプレートHTML
|
|
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル
|
BeanIDが |
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「 |
|
エラー画面用のJSP
|
|
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル
|
BeanIDが |
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
プロパティキーに指定しているメッセージIDのプロジェクト区分の暫定値「 |
|
エラー画面用のThymeleafのテンプレートHTML
|
|
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル
|
BeanIDが |
3.1.3.3. メッセージ文言¶
[application-messages.properties]
e.xx.fw.5001 = Resource not found.
# omitted
# typemismatch
typeMismatch="{0}" is invalid.
# omitted
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
メッセージ定義ファイル
|
アプリケーション要件に応じたメッセージに修正する。 入力チェックでエラーとなった際に表示するメッセージ(Bean Validationのメッセージ)についても、アプリケーション要件に応じて修正(デフォルトメッセージの上書き)が必要になる。
デフォルトメッセージの上書き方法については、「エラーメッセージの定義」を参照されたい。
|
3.1.3.4. エラー画面¶
Maven Archetypeで作成したプロジェクトでは、エラーの種類毎にエラー画面を表示するためのJSP及びHTMLを提供しているが、
画面レイアウト
画面タイトル
メッセージの文言
[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
|
アプリケーション要件(UI規約など)に合わせて修正する。 エラー画面を表示するJSPをカスタマイズする際は、「例外ハンドリングの コーディングポイント(JSP/Thymeleaf編)」を参照されたい。 |
|
エラー画面用のHTML
|
アプリケーション要件(UI規約など)に合わせて修正する。 |
[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>
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
エラー画面用のテンプレートHTML
|
アプリケーション要件(UI規約など)に合わせて修正する。 エラー画面を表示するテンプレートHTMLをカスタマイズする際は、「例外ハンドリングの コーディングポイント(JSP/Thymeleaf編)」を参照されたい。 |
|
エラー画面用の静的なHTML
|
アプリケーション要件(UI規約など)に合わせて修正する。 |
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定義ファイル
|
|
|
インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ
|
ディレクトリを削除する。 |
[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
カスタマイズ対象のファイルとカスタマイズ方法を以下に示す。
項番 |
対象ファイル |
カスタマイズ方法 |
---|---|---|
環境依存するコンポーネントを定義するBean定義ファイル
|
|
|
インメモリデータベース(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 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;
}
[artifactId]-env.xml
<bean id="dataSource" 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="maxWait" >
<bean class="java.time.Duration" factory-method="ofMillis">
<constructor-arg value="${cp.maxWait}" />
</bean>
</property>
</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.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層)のコンポーネントを管理するモジュール。 このモジュールでは、主に以下のコンポーネントやファイルを管理する。
|
(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-parentparent-pom(親POM)と呼ばれるプロジェクト。pom.xmlファイルだけを持ち、その他のソースコードや設定ファイルは一切持たない、シンプルなプロジェクト。他のプロジェクトのpom上で、このbar-parentプロジェクトを<parent>タグに指定することによって、親POMに指定された共通設定情報を自身に反映させることができる。
- bar-initdbRDBMSのテーブル定義(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-aaドメインに関わるドメイン層のjavaクラス、単体テストケース等を格納するプロジェクト。最終的に*.jarファイル化する。
- bar-domain-bbドメインに関わるドメイン層のクラス。
- 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-seleniumweb-aプロジェクトのための、Selenium WebDriverによるテストケースを格納するプロジェクト。
- bar-web-b-seleniumweb-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)
│ │ │ └── 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を構築する場合は、パッケージ名を |
(4)
|
Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。 |
(5)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(6)
|
アプリケーション層で使用する設定値を定義するプロパティファイル。 作成時点では、空のファイルである。 |
(7)
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(8)
|
このファイルには、以下のBeanを定義する。
REST APIを構築する場合は、ファイル名を |
(9)
|
Spring Securityのコンポーネントを定義するためのBean定義ファイル。 このファイルは、Webアプリケーション用のアプリケーションコンテキストを作成する際に読み込む。 |
(10)
|
アプリケーション層で使用するメッセージ定義ファイルを格納するディレクトリ。 |
(11)
|
アプリケーション層で使用するメッセージを定義するプロパティファイル。
|
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ ├── app ... (2)
│ │ │ ├── common
│ │ │ │ └── error
│ │ │ │ └── CommonErrorController.java ... (3)
│ │ │ └── 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を構築する場合は、パッケージ名を |
(3)
|
エラー画面を表示するためのControllerクラス。 |
(4)
|
Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。 |
(5)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(6)
|
アプリケーション層で使用する設定値を定義するプロパティファイル。 作成時点では、空のファイルである。 |
(7)
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(8)
|
このファイルには、以下のBeanを定義する。
REST APIを構築する場合は、ファイル名を |
(9)
|
Spring Securityのコンポーネントを定義するためのBean定義ファイル。 このファイルは、Webアプリケーション用のアプリケーションコンテキストを作成する際に読み込む。 |
(10)
|
アプリケーション層で使用するメッセージ定義ファイルを格納するディレクトリ。 |
(11)
|
アプリケーション層で使用するメッセージを定義するプロパティファイル。
|
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ └── app ... (2)
│ │ └── welcome
│ │ └── HelloController.java ... (4)
│ ├── resources
│ │ ├── META-INF
│ │ │ └── spring ... (5)
│ │ │ ├── application.properties ... (6)
│ │ │ ├── applicationContext.xml ... (7)
│ │ │ ├── spring-mvc.xml ... (8)
│ │ │ └── spring-security.xml ... (9)
│ │ └── i18n ... (10)
│ │ └── application-messages.properties ... (11)
項番
|
説明
|
---|---|
(2)
|
アプリケーション層のクラスを格納するためのパッケージ。 REST APIを構築する場合は、パッケージ名を |
(4)
|
Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。 |
(5)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(6)
|
アプリケーション層で使用する設定値を定義するプロパティファイル。 作成時点では、空のファイルである。 |
(7)
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(8)
|
このファイルには、以下のBeanを定義する。
REST APIを構築する場合は、ファイル名を |
(9)
|
Spring Securityのコンポーネントを定義するためのBean定義ファイル。 このファイルは、Webアプリケーション用のアプリケーションコンテキストを作成する際に読み込む。 |
(10)
|
アプリケーション層で使用するメッセージ定義ファイルを格納するディレクトリ。 |
(11)
|
アプリケーション層で使用するメッセージを定義するプロパティファイル。
|
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ └── app ... (2)
│ │ ├── common
│ │ │ └── error
│ │ │ └── CommonErrorController.java ... (3)
│ │ └── welcome
│ │ └── HelloController.java ... (4)
│ ├── resources
│ │ ├── META-INF
│ │ │ └── spring ... (5)
│ │ │ ├── application.properties ... (6)
│ │ │ ├── applicationContext.xml ... (7)
│ │ │ ├── spring-mvc.xml ... (8)
│ │ │ └── spring-security.xml ... (9)
│ │ └── i18n ... (10)
│ │ └── application-messages.properties ... (11)
項番
|
説明
|
---|---|
(2)
|
アプリケーション層のクラスを格納するためのパッケージ。 REST APIを構築する場合は、パッケージ名を |
(3)
|
エラー画面を表示するためのControllerクラス。 |
(4)
|
Welcomeページを表示するためのリクエストを受け取るためのControllerクラス。 |
(5)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(6)
|
アプリケーション層で使用する設定値を定義するプロパティファイル。 作成時点では、空のファイルである。 |
(7)
|
Webアプリケーション用のアプリケーションコンテキストを作成するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(8)
|
このファイルには、以下のBeanを定義する。
REST APIを構築する場合は、ファイル名を |
(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)
|
静的なリソースファイルを格納するディレクトリ。 このディレクトリは、リクエストの内容によって応答する内容がかわらないファイルを格納する。
具体的には以下のファイルを格納する。
Spring MVCが提供する静的リソースの管理メカニズムを適用しやすくするために、専用のディレクトリを設ける構成を採用している。 |
(19)
|
アプリケーション全体に適用する画面スタイルを定義するCSSファイル。 |
│ └── webapp
│ ├── WEB-INF
│ │ ├── views ... (12)
│ │ │ ├── common
│ │ │ │ └── error ... (13)
│ │ │ │ ├── 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
項番
|
説明
|
---|---|
(12)
|
Viewを構築するテンプレートファイル(HTMLなど)を格納するディレクトリ。 |
(13)
|
エラー画面を表示するためのテンプレートHTML及び静的なHTMLを格納するディレクトリ。
作成時点では、アプリケーション実行時に発生する可能性があるエラーに対応するテンプレート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
│ │ └── 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を定義する。
|
(6)
|
インフラストラクチャ層のコンポーネントを定義するためのBean定義ファイル。 このファイルには、O/R MapperなどのBean定義を行う。 |
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── project
│ │ └── domain ... (2)
│ │ ├── model
│ │ ├── repository
│ │ └── service
│ └── resources
│ └── META-INF
│ └── spring ... (3)
│ ├── [artifactId]-codelist.xml ... (4)
│ ├── [artifactId]-domain.xml ... (5)
│ └── [artifactId]-infra.xml ... (6)
項番
|
説明
|
---|---|
(2)
|
ドメイン層のクラスを格納するためのパッケージ。 |
(3)
|
Spring FrameworkのBean定義ファイルとプロパティファイルを格納するディレクトリ。 |
(4)
|
コードリストを定義するためのBean定義ファイル。 |
(5)
|
ドメイン層のコンポーネントを定義するためのBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(6)
|
インフラストラクチャ層のコンポーネントを定義するためのBean定義ファイル。 このファイルには、O/R MapperなどのBean定義を行う。 |
└── test
└── java
└── com
└── example
└── project
├── domain
│ ├── repository
│ └── service
└── config
└── TestContextConfig.java ... (7)
項番
|
説明
|
---|---|
(7)
|
ドメイン層のユニットテスト用のコンポーネントを定義するためのBean定義ファイル。 |
└── test
├── java
│ └── com
│ └── example
│ └── project
│ └── domain
│ ├── repository
│ └── service
└── resources
└── test-context.xml ... (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で作成したプロジェクトでは、サンプル実装がコメントアウトされた状態になっている。
実際のアプリケーション開発で使用することは想定していないので、基本的にはこのファイルは削除すること。
|
└── src
├── main
│ ├── java
(...)
│ └── resources
│ ├── META-INF
│ │ ├── mybatis ... (8)
│ │ │ └── mybatis-config.xml ... (9)
│ │ └── 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)
|
環境毎の設定ファイルを管理するためのディレクトリ。 作成時点では、最もシンプルな構成として、以下のディレクトリ(雛形のディレクトリ)が用意されている。
|
(3)
|
envモジュールの構成を定義するPOM(Project Object Model)ファイル。 このファイルでは、以下の定義を行う。
|
└── 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を定義する。
|
(6)
|
環境依存する設定値を定義するプロパティファイル。 作成時点では、データソースの設定値(接続情報とコネクションプールの設定値)が定義されている。 |
(7)
|
インメモリデータベース(H2 Database)をセットアップするためのSQLを格納するディレクトリ。
このディレクトリは、ちょっとした動作検証を行う時のために用意しているディレクトリである。
実際のアプリケーション開発で使用することは想定していないので、基本的にはこのディレクトリは削除すること。
|
(8)
|
Logback(ログ出力)の設定ファイル。 ログ出力については、「ロギング」を参照されたい。 |
└── src
└── main
└── resources ... (4)
├── META-INF
│ └── spring
│ ├── [artifactId]-env.xml ... (5)
│ └── [artifactId]-infra.properties ... (6)
├── database ... (7)
│ ├── H2-dataload.sql
│ └── H2-schema.sql
└── logback.xml ... (8)
項番
|
説明
|
---|---|
(4)
|
開発用の設定ファイルを管理するためのディレクトリ。 |
(5)
|
環境依存するコンポーネントを定義するBean定義ファイル。 このファイルには、以下のBeanを定義する。
|
(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プロジェクトを参照されたい。
|
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)ファイル。 このファイルでは、以下の定義を行う。
|
(2)
|
テスト用のコンポーネントと設定ファイルを格納するディレクトリ。 作成例については、共通ライブラリのテストアプリケーションのseleniumプロジェクトを参照されたい。 |
(3)
|
Selenium WebDriverを使用したサンプルテストクラス。 作成時点では、Welcomeページのタイトルを検証するテストケースが実装されている。 |
(4)
|
テストで使用する設定値を定義するプロパティファイル。 作成時点では、アプリケーションサーバのURLは |
(5)
|
テスト用のコンポーネントを定義するためのBean定義ファイル。 作成時点では、サンプルのテストを実行するために必要な設定がされている。 |
[artifactId]-selenium
├── pom.xml ... (1)
└── src
└── test ... (2)
├── java
│ └── com
│ └── example
│ └── project
│ └── selenium
│ └── welcome
│ └── HelloIT.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.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のバージョンは利用する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定義ファイルの関係を以下に示す。
項番
|
説明
|
---|---|
(1)
|
Webアプリケーション用のアプリケーションコンテキスト。 上記図で示す通り、
で定義したコンポーネントがWebアプリケーション用のアプリケーションコンテキスト(DIコンテナ)に登録される。 Webアプリケーション用のアプリケーションコンテキストに登録されているコンポーネントは、各 |
(2)
|
上記図で示す通り、
で定義したコンポーネントが
|
項番
|
説明
|
---|---|
(1)
|
Webアプリケーション用のアプリケーションコンテキスト。 上記図で示す通り、
で定義したコンポーネントがWebアプリケーション用のアプリケーションコンテキスト(DIコンテナ)に登録される。 Webアプリケーション用のアプリケーションコンテキストに登録されているコンポーネントは、各 |
(2)
|
上記図で示す通り、
で定義したコンポーネントが
|
Note
同じコンポーネントを両方のアプリケーションコンテキストに登録した時の動作について
Webアプリケーション用のアプリケーションコンテキストとDispatcherServlet
用のアプリケーションコンテキストの両方に同じコンポーネントが登録されている場合は、同じアプリケーションコンテキスト(DispatcherServlet
用のアプリケーションコンテキスト)内に登録されているコンポーネントがインジェクションされる点を補足しておく。
特に、ドメイン層のコンポーネント(ServiceやRepositoryなど)をDispatcherServlet
用のアプリケーションコンテキストに登録しないように注意する必要である。
ドメイン層のコンポーネントをDispatcherServlet
用のアプリケーションコンテキストに登録してしまうと、トランザクション制御を行うコンポーネント(AOP)が有効にならないため、データベースへの操作がコミットされない不具合が発生してしまう。
なお、Maven Archetypeで作成したプロジェクトでは、上記のような現象は発生しないように設定が行われている。設定の追加又は変更を行う場合は、注意してほしい。
3.1.5.3. オフライン環境におけるアプリケーション開発¶
cd C:\work\todo
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] ------------------------------------------------------------------------
${HOME}/.m2
へコピーすることで、作業は完了となる。Warning
オフライン環境での開発における注意点
オフライン環境では新規に依存関係をインターネットから取得することが不可能となるため、POM(Project Object Model)ファイルを編集しないこと。
POMファイルに編集を加える場合は、再度オンライン環境へ戻る必要がある。