MavenプロジェクトをTomcatで動かす方法

## 経緯

「Webアプリ用のMavenプロジェクトをTomcatで動かしたいです！」と方法を聞かれたので、私が知っている方法をまとめておく。開発の上でのルールに合わせて、いずれか一つの方法でよい。

## 方法1 [Apache Tomcat Maven Plugin](http://tomcat.apache.org/maven-plugin.html) を使う

### 設定

プロジェクトのpom.xmlのpluginsの部分にApache Tomcat Maven Pluginを追加。

```xml:pom.xml
<plugins>
  <!-- snip -->
  <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <path>/foo</path>
    </configuration>
  </plugin>
</plugins>
```

### 実行

mvnでTomcatを実行。

```bash
$ mvn tomcat7:run
```

http://localhost:8080/foo/ にブラウザでアクセスして、Webアプリが動作していることを確認。

なお、server.xmlを読ませたいときは、configuretion要素の中にserverXml要素を作成すれば良いようだ。

## 方法2 既存のTomcatとApache Tomcat Maven Pluginを連係させる

方法1ではMavenがダウンロードしたTomcatを動作させているが、いろいろな理由で、すでにインストール済みのTomcatを使いたい場合があるだろう。このような場合には、Apache Tomcat Maven Pluginを用いて既存のTomcatのmanagerを通じてプロジェクトをdeployさせる。

### 設定

以後は、すでにインストール済みのTomcatがlocalhost:8080で動作していることを前提とする。  
まず、方法1のpom.xmlのconfiguration要素の中に、さらにserver要素、url要素を追加する。

```xml:pom.xml
<plugins>
  <!-- snip -->
  <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <path>/foo</path>
      <server>tomcat-localhost</server>
      <url>http://localhost:8080/manager/text</url>
    </configuration>
  </plugin>
</plugins>
```

次に、managerをmvnから操作できるように、mavenのsettings.xmlとtomcatのtomcat-user.xmlを変更する。

```xml:~/.m2/settings.xml
<settings>
  <!-- snip -->
  <servers>
    <server>
      <id>tomcat-localhost</id>
      <username>foo</username>
      <password>bar</password>
    </server>
  </servers>
</settings>
```

必ず、 **settings.xmlの\<id\>要素とpom.xmlの\<server\>要素の値を一致させておく** こと。

```xml:$CATALINA_HOME/conf/tomcat-user.xml
<tomcat-users>
  <!-- snip -->
  <user username="foo" password="bar" roles="manager-script"/>
</tomcat-users>
```

すでにmanager-guiなどを使っている場合は、roles属性の値をカンマで区切って複数設定できる。

### 実行

Tomcatが起動している状態で、以下のコマンドを実行する。

```bash
$ mvn package tomcat7:deploy
```
http://localhost:8080/foo/ にブラウザでアクセスして、Webアプリが動作していることを確認。

なお、deployのし直しは `tomcat7:redeploy`、deployの停止は `tomcat7:undeploy` などで実行できる。


## 方法3 既存のTomcatのコンテキストファイルでビルド済みのフォルダを指定する

諸事情でApache Tomcat Maven Pluginを使えない/使わないときは、Tomcatのコンテキストファイルからprojectのtargetのビルド済みのフォルダを指定する。

他に比べてスマートじゃないけど、こういう環境もあるだろうということで。

### 設定

以後はプロジェクトのディレクトリが /Users/hoge/workspace/foo だと仮定する。
また、`mvn package`した結果、ビルド済みのフォルダがプロジェクト内の target/foo-0.1-SNAPSHOT に作成されたと仮定する。

$CATALINA_HOME/conf/Catalina/localhost/ に、コンテキストファイルfoo.xmlを作成する<sup><a name="fnref:1"></a>[1](#fn:1)</sup>。

```bash
$ vi CATALINA_HOME/conf/Catalina/localhost/foo.xml
```

```xml:foo.xml
<Context path="/foo" docBase="Users/hoge/workspace/foo/target/foo-0.1-SNAPSHOT" />
```

### 実行

Tomcatを実行した上で、http://localhost:8080/foo/ にブラウザでアクセスしてWebアプリが動作していることを確認する。

### 備考

バージョン番号の変更などにあわせてビルド済みのフォルダが代わる（コンテキストファイルを編集する）のが嫌な場合は、pom.xmlの\<build\>要素に\<filename\>要素を足しておく。

```xml:pom.xml
<build>
  <finalName>foo</finalName>
　<!-- snip -->
</build>
```

こうすると、ビルド済みのフォルダ（およびwarファイル名）が固定される。

## 方法4 Eclipseの場合

Eclipseの場合は、EclipseのWTPサーバにTomcatを追加して実行する方法と、往年の[Sysdeo Eclipse Tomcat Launcher plugin](http://www.eclipsetotale.com/tomcatPlugin.html) を利用する方法<sup><a name="fnref:2"></a>[2](#fn:2)</sup>がある。

後者は方法3とほとんど変わらない<sup><a name="fnref:1"></a>[1](#fn:1)</sup>ので、前者の方法。（誰かから要望があれば書くかも）

### 設定

1. EclipseのServersウィンドウを開く  
(Window -> Show View -> Other... -> Server -> Servers)
1. まだTomcatサーバを追加したことがなければ追加する  
(右クリック -> New -> Server)
1. New Serverダイアログが表示されるので、Apacheフォルダから動作させたいTomcatのバージョンを選択して'Next'ボタンを押す
1. 'Tomcat installation directory'でTomcatがインストールされたファイルパスを指定する。'JRE'も必要があれば設定し、'Next'ボタンを押す
1. 動作させるMavenプロジェクトを'Add'して'Finish'ボタンを押す
1. ServersウィンドウにTomcatサーバが追加されていることを確認する。動作させるアプリケーションの切り替えは、Tomcatサーバを右クリックして、Add and Remote...を選択すればよい

### 実行

ServersウィンドウのTomcatサーバを右クリックし、DebugもしくはStartをクリックする。Serversウィンドウ右上のアイコンをクリックしても同様。

## 備考

コンテキストルートなどは原則pom.xmlに従って設定されているが、確認したいときはプロジェクトのプロパティから確認できる。

## 参考

> [no more sysdeo tomcat launcher on eclipse juno](http://www.selikoff.net/2012/07/02/no-more-sysdeo-tomcat-launcher-on-eclipse-juno/)

----
1. <a name="fn:1"></a>Eclipseの[Sysdeo Eclipse Tomcat Launcher plugin](http://www.eclipsetotale.com/tomcatPlugin.html)を使ってる場合は、「アプリケーションルートとするサブディレクトリー」の値に`/target/foo-0.1-SNAPSHOT`と入力してもよい[&#8617;](#fnref:1)
2. <a name="fn:2"></a>執筆時点でTomcat7まで対応。Tomcat8でもTomcat7として設定しておけば動くよ！的な記事も見かける。[&#8617;](#fnref:1)