Eclipse+Maven+GlassFish構成のウェブプロジェクトの作成

## はじめに

Eclipse（Kepler）で下記構成のウェブアプリケーションを作成します。
* JavaEE7
* Maven3.0.4
* GlassFish4.1

後述しますが、上記の構成であればNetBeansでの開発を強くお勧めします。
また、作成したプロジェクトは下記にコミットしています。
https://github.com/MT-01/javaee-webapp


## GlassFish4.1をダウンロード

まず下記よりダウンロードします。
https://glassfish.java.net/download.html

ダウンロード後、解凍して任意の場所に置きます。
今回はC:直下に配置しました（C:\glassfish4\glassfish\bin）

## EclipseにGlassFishToolインストール

EclipseでGlassFishを使えるようにするため、ウィンドウ→設定→サーバー→ランタイムからGlassFishToolをインストールします。

## サーバーランタイム環境を設定

先ほどダウンロードしたGlassFish4.1を設定追加します

<dl>
  <dt>JDK</dt>
  <dd>java7</dd>
  <dt>Runtime Name</dt>
  <dd>GlassFish 4.1</dd>
  <dt>GlassFish Server Directory</dt>
  <dd>C:/glassfish4/glassfish</dd>
</dl>

## 動的ウェブプロジェクトを作成

プロジェクト名は任意（今回は「javaee-webapp」としました）。
ターゲットランタイムはGlassFish4.1
動的webモジュールバージョンは3.1としてください。

入力したら次へを選択すると、ビルドパス上のソースフォルダを設定する画面になりますが、
さらに次へを選択します。
コンテンツ・ディレクトリは「src/main/webapp」とします。

全て終わったら、完了を選択してプロジェクトを作成します。


## Mavenプロジェクトに変換

プロジェクトを右クリック→構成→Mavenプロジェクトへ変換を選択し、グループID、アーティファクトID、パッケージングを入力します。今回はグループIDをcom.sample、アーティファクトIDをjavaee-webapp、パッケージングはウェブアプリケーションなのでwarとしました。

最初からEclipseの新規作成からMavenプロジェクトを作成することもできますが、今回はあえて変換する方法をとりました。理由は詳しくは割愛しますが、私の環境だと動的webモジュールが古いバージョンでインストールされてしまうことで依存系のエラーが発生してしまいました。

## ソースフォルダを作成

変換処理でMavenの主役であるpom.xmlや、src/main/webapp、targetフォルダなどを作成してくれますが、ソースフォルダであるsrc/main/java、src/main/resourcesフォルダを作成してくれませんので、お粗末ですが手動で作成します。

Mavenのディレクトリレイアウトについてはこちら。
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

作成したらソースフォルダに設定します。
src/main/javaフォルダをを右クリック→ビルド・パス→ソースフォルダとして使用を選択
src/main/resourcesも同様

プロジェクト右クリック→プロパティ→ビルド・パス→ソースタブを見ると、javaee-webapp/srcがソースフォルダとなってしまっているので除去します。またbuildフォルダはもう使用しないので削除しておきます。

## maven-glassfish-plugin設定

Mavenビルドで作成したwarをGlassFishにデプロイするために、maven-glassfish-pluginを作成します。そのためpomにプラグイン追加の記述を追加します。

```xml:pom.xml
      <plugin>
        <groupId>org.glassfish.maven.plugin</groupId>
        <artifactId>maven-glassfish-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <user>admin</user>
          <glassfishDirectory>C:\glassfish4</glassfishDirectory>
          <adminPassword>admin</adminPassword>
          <debug>true</debug>
          <echo>true</echo>
          <components>
          <component>
          <name>${project.artifactId}</name>
          <artifact>${project.build.directory}/${project.build.finalName}.war</artifact>
          </component>
          </components>
          <domain>
            <name>javaee-webapp</name>
            <adminPort>4848</adminPort>
          </domain>
        </configuration>
      </plugin>
```

## GlassFish設定

まずEclipseにサーバー情報を追加します。Eclipseのサーバービューの空白部分を右クリック→新規→サーバから、GlassFish4.1を選択して次へを選択します。管理者IDにはadmin、管理者パスワードは空白としておきます。

次にGlassFish管理画面からパスワードを設定します。GlassFish管理画面(http://localhost:4848/）にアクセスし、Domain→Administrator Passwordを選択します。新しいパスワードを任意で設定します（今回はadminとします）。これをやると先ほど追加したEclipseのサーバー設定はパスワード違いで使えなくなるので、いったん消して再登録しなおします（パスワードはadmin）。ちなみにサーバー設定画面でデプロイ対象のアプリケーションを選択できますが、**何も登録しないでください**。登録してしまうと、Eclipse標準のビルド？が実行されてしまうようで、Mavenでビルドされた場合と異なることがあります。あくまでビルドはMavenで行います。

次に、C:\glassfish4\bin\asadminをC:\glassfish4\bin\asadmin_bkなどに変更します。そのままだとEclipseからのデプロイ時に、asadmin.batではなくasadmin（shelll)が実行されてしまうためです。

## デプロイの実行構成
Mavenでのビルド、デプロイの実行構成を作成します。
プロジェクトを右クリック→実行→実行の構成→Maven buildで、以下の2つの構成を作成します

【deploy実行構成】
名前：javaee-webapp-deploy(任意)
基底ディレクトリ：ワークスペースを参照ボタンを選択して、javaee-webappを選択
ゴールにwar:war glassfish:deployと入力

【redeploy実行構成】
名前：javaee-webapp-redeploy(任意)
基底ディレクトリ：ワークスペースを参照ボタンを選択して、javaee-webappを選択
ゴールにwar:war glassfish:redeployと入力

## HelloWorld

任意の場所にHelloWorldクラスを作成します。

```java:HelloWorld.java

@WebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res)
			throws IOException, ServletException {

		req.getRequestDispatcher("helloworld.jsp").forward(req, res);
	}

}

```

続いてsrc/main/webapp直下にJSPを作成します

```jsp:helloworld.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World!
</body>
</html>

```

先ほど作成したdeploy実行構成を実行します。
デプロイがうまくできたら、以下のURLにアクセスし「Hello World! 」と表示されたら成功です。

http://localhost:8080/javaee-webapp/HelloWorld


## まとめ
今回はEclipseを使用しましたが、上記の構成であればNetBeansでの開発を強くお勧めします。理由は以下の通りです。

1. 動くプロジェクトを作成するまでに手順がやたら多い
2. ホットデプロイができない（致命傷）
3. deployとredeployの実行構成を使い分ける必要がある（致命傷）

1についてはお察しの通り、たかだかHelloWorldを行うのにこれだけの手順が必要なのはどうかと思います。
2,3については、やり方があるのかもしれませんが、私が調べた限りではわかりませんでした。NetBeansであれば、1,2,3すべての問題を解決できます。

それにしてもMavenといい、GlassFishといいあまりこの辺の構成についてピンポイントで情報が出てこなかったのでかなり骨がおれました。