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 (停止) などがありますが、使い方は必要になったときに随時行います。