5. Maven による実アプリケーション開発
2006.07.24 株式会社四次元データ 鈴木 圭
- 5.1. 作成するアプリケーションの概要
- 5.2. プロジェクトの準備
- 5.3. データベース部分の作成 (com.example.webchat.db.*)
- 5.4. Tomcat の準備
- 5.5. Web アプリケーション部分の作成
- 5.6. Web アプリケーション部分の改良
- 5.7. まとめ
今回は Maven を用いた具体的な開発例として、Web ベースの簡単なチャットアプリケーションを作成したいと思います。
前章までは Maven を用いた開発に必要な情報を個別に紹介してきましたので、本章ではそれらのまとめとして、Web ベースの簡単なチャットアプリケーションの作成を例に、具体的な開発の道のりを紹介したいと思います。
5.1. 作成するアプリケーションの概要
今回作成する Web ベースのチャットアプリケーションのインタフェースは次のようになります:

また、完成品のダウンロードは以下のリンクから行うことができます:
アプリケーションの特徴は:
- 表示は単一の JSP ページで行う
- 表示の更新は手動で行う
- Web サーバには Tomcat を使用する
- アプリケーション・フレームワークとして Struts を使用する
という具合に、必要最小限の機能の実装を行います。
5.2. プロジェクトの準備
まずはプロジェクトの作成から Eclipse へのインポートまでの手順を説明します。
5.2.1. プロジェクトの作成
プロジェクトの groupId と artifactId は、それぞれ「com.example.webchat」と「webchat」として作成します:
| groupId | artifactId |
|---|---|
| com.example.webchat | webchat |
今までは JAR を作成するプロジェクトしか作成しませんでしたが、今回は Web アプリケーション用のプロジェクトを作成します:
mvn archetype:create -DgroupId=com.example.webchat
-DartifactId=webchat
-DarchetypeArtifactId=maven-archetype-webapp
Web アプリケーション用のプロジェクトを作成する場合は、通常の (JAR を作成する) プロジェクトを作成する場合とは異なり、archetypeArtifactId パラメータで「maven-archetype-webapp」を指定します。archetypeArtifactId は作成するスケルトンの種類を指定するためのものであり、今までは省略時のデフォルトである「maven-archetype-quickstart」としてプロジェクトを作成していました。今回は Web アプリケーション用のスケルトンを作成するので、明示的に指定します。
作成されたプロジェクトの構成は次のようになっています:
webchat
│ pom.xml
│
└─src
└─main
├─resources
└─webapp
│ index.jsp
│
└─WEB-INF
web.xml
5.2.2. ソースコード用ディレクトリの作成
Web アプリケーション用のスケルトンには Java のソースコードを配置するディレクトリ (src/main/java) が作成されないので、手作業で作成します。以下の構成になるように src/main/java 以下のディレクトリを作成してください:
webchat
│ pom.xml
│
└─src
└─main
├─java
│ └─com
│ └─example
│ └─webchat
├─resources
└─webapp
│ index.jsp
│
└─WEB-INF
web.xml
5.2.3. プロジェクトの設定
コーディングに入る前に、プロジェクトの設定を行いましょう。pom.xml を開き、次の変更を行ってください:
- project/artifactId の値を「webchat」に変更する。
- project/version の値を「1.0」に変更する。
- project/url 要素を削除する。
- Java 1.5 としてコンパイルするように maven-compiler-plugin の設定を行う。
設定を行った後の pom.xml は次のようになります:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.webchat</groupId>
<artifactId>webchat</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>webchat</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>webchat</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
とりあえず、最初の設定はこれだけにしておき、あとは必要に応じて設定を行うことにしましょう。
(プラグインの設定方法については「3.2. プラグインについて」で説明しました。)
ここまでの作業が終われば、プロジェクトを Eclipse にインポートします。
5.2.4. Eclipse にインポートする
プロジェクトを Eclipse にインポートするには、次のコマンドでプロジェクトを Eclipse のプロジェクトに変換します:
mvn eclipse:eclipse
次に Eclipse から (「Existing Projects into Workspace」として) インポートします:
プロジェクトを Eclipse にインポートする詳しい方法は、前回の「4. Eclipse との連携」で説明しているので、そちらも参照してください。
5.3. データベース部分の作成 (com.example.webchat.db.*)
データベース関係のクラスやインタフェースは com.example.webchat.db パッケージ以下に作成することにします。(今回のサンプルではデータベースを実際に用意するのではなく、チャットでの発言データなどは全てメモリ上に保存します。)
作成するのはチャットアプリケーションなので、チャットでの発言を保持するクラスと、それを保存/取得するためインタフェース及び実装クラスを作成します:
| com.example.webchat.db.bean.MessageBean | チャットでの発言を保持するクラス。 |
| com.example.webchat.db.dao.MessageDao | MessageBean を保存/取得するためのインタフェース。 |
| com.example.webchat.db.dao.impl.MessageDaoOnMemoryImpl | データをメモリ上に記録する MessageDao の実装。 |
5.3.1. MessageBean
MessageBean クラスは、チャットでの発言を保持するクラスです:
public class MessageBean
{
// 発言日時.
private Date date = null;
// 発言者名.
private String name = null;
// 発言内容.
private String message = null;
//
// ... コンストラクタ及びアクセッサ.
//
}
MessageBean クラスには「発言日時」「発言者名」「発言内容」の 3 つのプロパティを持たせました。
5.3.2. MessageDao
MessageDao は、MessageBean の保存と取得を行うためのインタフェースです:
public interface MessageDao
{
// チャットでの発言を保存します.
public void save(MessageBean message);
// チャットでの発言データを返します.
public MessageBean[] getAll();
}
今のところ、データの保存は一件ずつ、取得はすべてまとめて行えればよいので、save(MessageBean) メソッドと getAll() メソッドの 2 つだけを持たせました。
5.3.3. MessageDaoOnMemoryImpl
MessageDaoOnMemoryImpl クラスは、全てのデータをメモリ上に保存する MessageDao の実装です。このクラスは Singleton として実装します:
public class MessageDaoOnMemoryImpl implements MessageDao
{
// 唯一のインスタンス.
private static final
MessageDaoOnMemoryImpl instance = new MessageDaoOnMemoryImpl();
// このクラスのインスタンスを返します.
public static MessageDaoOnMemoryImpl getInstance()
{
return instance;
}
// リストの先頭が最も新しいデータ (一番最後に save() されたデータ).
private List<MessageBean> messages =
Collections.synchronizedList(new LinkedList<MessageBean>());
// このクラスは Singleton として実装されています.
private MessageDaoOnMemoryImpl()
{
// BLANK.
}
// チャットでの発言を保存します.
public void save(MessageBean message)
{
messages.add(0, message);
}
// チャットでの発言データを返します.
public MessageBean[] getAll()
{
return messages.toArray(new MessageBean[messages.size()]);
}
}
このクラスを利用すると、アプリケーションの終了とともにチャットでの発言データは消えてしまいますが、今回はデータベースを用意する手間を省くため、メモリ上にデータを保持する MessageDao の実装を行いました。
5.4. Tomcat の準備
データベース部分の作成が終わったので、次は Web アプリケーション部分の作成に入りたいところですが、その前に Tomcat の準備を行い、Web アプリケーションを動作させる環境を整えましょう。
ここで行うことは、Tomcat を準備することと、Maven から Tomcat を扱うためのプラグイン tomcat-maven-plugin を導入することです。
5.4.1. Tomcat のインストールと設定
J2EE コンテナである Apache Tomcat は、以下のサイトから入手することができます:
Tomcat をインストールしていない方は、上記サイトから Tomcat を入手し、インストールしてください (ダウンロードページの [Binary Distributions] -> [Core:] から適当なものをダウンロードします)。
インストールが終わったら、Tomcat が動作することを確認しておいてください。また、Tomcat Manager へのアクセス権限を持ったユーザが必要になるので、Tomcat Manager にアクセス可能なユーザが存在しない場合は作成しておいてください。
Tomcat のユーザは、「CATALINA_HOME/conf/tomcat-users.xml」(CATALINA_HOME は Tomcat をインストールしたディレクトリ) を見ることで確認できます。Tomcat Manager にアクセス可能なユーザを追加するには、tomcat-users.xml の tomcat-users 要素の入れ子として「<user username="ユーザ名" password="パスワード" roles="manager">」という設定を追加します。
ここまでの作業を終えたら、Tomcat を実行して、Tomcat Manager にアクセスできることを確認してください。デフォルトでは「http://localhost:8080/manager/html」が Tomcat Manager の URL なので、そこにアクセスし、Tomcat Manager へのアクセス権限を持つユーザ名とパスワードを入力し、無事にログインできるか確認します。
5.4.2. tomcat-maven-plugin の導入
Tomcat のインストールの次は、Maven から Tomcat を操作するためのプラグインである tomcat-maven-plugin を導入しましょう:
tomcat-maven-plugin は Maven のセントラルリポジトリではなく、codehaus の Maven 2 Plugins Project の Snapshot Repository で提供されているので、pom.xml でリモートリポジトリの設定を行います:
<project ...>
...
<repositories>
<repository>
<releases>
<enabled>false</enabled>
</releases>
<snapshots />
<id>Maven Snapshots</id>
<url>http://snapshots.maven.codehaus.org/maven2/</url>
</repository>
</repositories>
...
<pluginRepositories>
<pluginRepository>
<releases>
<enabled>false</enabled>
</releases>
<snapshots />
<id>Maven Snapshots</id>
<url>http://snapshots.maven.codehaus.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
...
</project>
5.4.3. tomcat-maven-plugin の設定
tomcat-maven-plugin の設定は、pom.xml と settings.xml の 2 箇所を変更する必要があります。
引き続き pom.xml において、tomcat-maven-plugin の設定として、アクセスするサーバの情報を指定します:
<project ...>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<server>tomcat</server>
<url>http://localhost:8080/manager</url>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>
project/build/plugins/configuration 要素の入れ子として server 要素と url 要素を指定します。server 要素では、サーバーの識別子として適当な値を指定します。url 要素には Tomcat Manager の URL を指定します。
次に、M2_HOME/conf/settings.xml にサーバーにアクセスするユーザ名やパスワードを指定します:
<settings>
...
<servers>
...
<server>
<id>tomcat</id>
<username>admin</username>
<password>admin</password>
</server>
...
</servers>
...
</settings>
サーバの設定は settings/servers 要素の入れ子として server 要素を追加します。server の子要素には id, username, password などが指定可能です。id 要素には、pom.xml の tomcat-maven-plugin の設定で指定したサーバ識別子 (configuration/server 要素で指定した値) と同じ値を指定します。username と password には Tomcat Manager にアクセス可能なユーザ名と、そのパスワードを指定します。この例ではユーザ名、パスワード共に「admin」として指定していますが、お使いの環境に応じた値を指定してください。
ここまでで tomcat-maven-plugin の設定は終わりです。tomcat-maven-plugin の設定は、リモートリポジトリの設定やサーバーの設定など煩雑なので、よく確認しながら行ってください。以下に変更箇所をまとめます:
- [pom.xml] リモートリポジトリの設定 (project/repositories/repository と project/pluginRepositories/pluginRepository)
- [pom.xml] プラグインの設定 (project/build/plugins/plugin)
- [settings.xml]サーバの設定 (settings/servers/server)
5.4.4. tomcat-maven-plugin の使い方
tomcat-maven-plugin は以下のゴールを持ちます:
| ゴール | 説明 |
|---|---|
| tomcat:deploy | アプリケーション (WAR) を配備する |
| tomcat:exploded | 展開済みの WAR を配備する |
| tomcat:inplace | WAR をその場で配備する |
| tomcat:list | Tomcat に配備されている全てのアプリケーションを一覧する |
| tomcat:redeploy | WAR を再配備する |
| tomcat:resources | JNDI リソースを一覧する |
| tomcat:roles | セキュリティ・ロールを一覧する |
| tomcat:info | Tomcat のバージョン、OS、JVM のプロパティを一覧する |
| tomcat:sessions | アプリケーションのセッション情報を一覧する |
| tomcat:start | アプリケーションを開始する |
| tomcat:stop | アプリケーションを停止する |
| tomcat:undeploy | アプリケーション (WAR) を配備解除する |
よく使用するゴールとして tomcat:deploy (配備)、tomcat:undeploy (配備解除)、tomcat:start (アプリケーションの開始)、tomcat:stop (停止) などがありますが、使い方は必要になったときに随時行います。

