EclipseでサーバサイドJavaを作るときのプロジェクトとwarファイルのエクスポート

結論から書くと「動的Webプロジェクト」で作るのがよさそう。

※ 調査結果をまとめたものなので確定情報というわけじゃないです。

先日 [Eclipseを使ってTomcat+JSP+Servlet+MySQLでメモアプリ作成](https://qiita.com/zaki-lknr/items/32690b071abf202281d6) と題して、簡単なServlet+JSPのプロジェクトを「Tomcatプロジェクト」で作成したけど、Mavenとの相性とか、プロジェクトの右クリックメニューの[Tomcatプロジェクト]->[プロジェクト設定に従い WAR ファイルをファイルを作成]しても単純にプロジェクト内のファイルを固めたファイルができたりとか、いろいろ微妙な感じだったので、少し調べてみた。

また、[Mavenプロジェクトへの変換](https://qiita.com/zaki-lknr/items/32690b071abf202281d6#tomcat%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92maven%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)については、Mavenプロジェクトには推奨のディレクトリ構成があり、その構成変換まではEclipseの変換機能はやってくれないので、Mavenを使用するつもりがあるのであれば、初めからMavenプロジェクトとして作成するのが良いらしい。

# プロジェクトの作成

## 動的Webプロジェクトで作成

Tomcatプロジェクトの作成以外に「動的Webプロジェクト」があり、これを選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/ad996596-f36c-2ca2-088d-d8f2c60fa1d9.png)

## Mavenのmaven-archetype-webappで作成

Mavenを使ってライブラリやビルドの管理をする場合は、「動的Webプロジェクト」でなく、「Mavenプロジェクト」を選択し、「アーキタイプ選択のスキップ」をチェックせずに「maven-archetype-webapp」を指定してプロジェクトを作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/1da97fe5-7f8c-430b-b817-b4204fc8d65d.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/25085fb0-a54d-061e-b82b-639c559d79fd.png)

このプロジェクトであれば、Mavenを使える動的Webプロジェクトになる

# warファイルの作成

## Tomcatプロジェクトの場合

プロジェクトの右クリックメニューの[Tomcatプロジェクト]->[プロジェクト設定に従い WAR ファイルをファイルを作成]からwarファイルを作成できる (※ 事前にプロジェクトプロパティのTomcatの設定の「WARエクスポート設定」を入力しておく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/cf0053a5-57bc-ef8a-b551-b1d0e1bf0f93.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/76df4029-0d02-48dc-df8b-8233734a919e.png)

ただし、このwarファイル作成だと、外部のjarファイル(JDBCとか)などが、ビルドパスのエクスポート設定とか行っても含まれなかったし、最初に書いた通り`.settings`ディレクトリとか、余計なものまで含まれており、とても微妙。(Tomcatへデプロイすれば動くことは動く)
外部jarをプロジェクトの構成内(`/WEB-INF/lib/***.jar`とか)に含めていればwarファイルには含まれる(が、その場合はmavenプロジェクト化した場合と二重管理になるような気が)

通常メニューの[エクスポート]はできない。(対象プロジェクトに含まれない)

## 動的Webプロジェクトの場合

※ Mavenプロジェクト(maven-archetype-webapp)も同様

Eclipse的にはTomcatプロジェクトではないため、Tomcatメニューからの作成はできない(メニューがない)。ただし、通常メニューの[ファイル(F)]->[エクスポート(O)]からwar形式のエクスポートが可能。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/b4ee8798-10ff-d9ad-6bdf-b242d4eb9e1d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/11da6cf3-0c35-f74f-8bac-9bf7064d6d28.png)


ここで、宛先(warファイルの保存先)を[参照]ボタン押下から適当に設定し、[完了]押下でwarファイルが作成される。
Mavenのmaven-archetype-webapp指定プロジェクトの場合は、Mavenで導入したJDBCとかの外部ライブラリも含めてwarファイルにエクスポートしてくれる。
動的Webプロジェクトの場合は、Tomcatプロジェクトのwarファイルと同様にプロジェクト構成内のファイルのみとなっている(プロジェクトの外部にあるファイルを参照している場合はwarファイルに含まれない)

# Servletクラスの新規作成

## Tomcatプロジェクトの場合

[新規作成メニューの「サーブレット」の作成が使えないので「クラス」の作成から作る](https://qiita.com/zaki-lknr/items/32690b071abf202281d6#%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)

## 動的Webプロジェクトの場合

新規作成メニューの「サーブレット」から作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/ce1d7dad-585e-388d-64d6-e1df6545f904.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/a423482d-2936-46b0-f725-f67b55fd34c6.png)

URLマッピング(ソースの`@WebServlet`アノテーションに相当)の指定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/4e59a9f9-7f2f-68a8-44b5-9a3ee7757776.png)


また、ソースファイル作成時にどのメソッドをoverrideしておくかも選択できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/c4ccf3ec-f54b-70a1-7c30-1c3567628971.png)

出力されるソース

```java:ExampleServlet.java
package jp.example.www;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MainServlet
 */
@WebServlet(description = "メイン画面", urlPatterns = { "/" })
public class MainServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MainServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
```

## maven-archetype-webappの場合

.javaファイルについては動的Webプロジェクトの場合と同じ。
このプロジェクトだと`src/main/webapp/WEB-INF/web.xml`にURLマッピングやdescriptionのメタ情報が記述されており、新規作成の「サーブレット」のメニューからであれば、自動で更新してくれる。