GlassFish/Payara Embeddedとwarとdomainと起動スクリプトをまとめてパッケージングし配布用zipを作る

# 目的
[前回の投稿](http://qiita.com/masaha03/items/d9433e074a1ea7e23c6b)で、GlassFish/Payara Embeddedとwarのパッケージング方法を検証した。今回は、さらにGlassFish/Payaraのdomainも含めてパッケージングし、配布用zipにするところまでを行う。
GlassFish/Payara Embeddedは、デフォルトではdomainをその都度テンポラリに生成し、使い捨てるようになっている。domainの設定を全て`CommandRunner`を使ったコードに落とし込み、起動のたびに一から設定し直すことも可能だが、面倒だ。また、そもそもログインモジュールやJDBCドライバの追加は不可能である。
GlassFish/Payara Embeddedはdomainのディレクトリを指定して起動することができる。この機能を使えば、予め設定済みのdomainを用いることができる。ディレクトリの位置だけコード内で指定しておき、後からその位置にdomainを配置することも可能だが、ビルドのさいに自動的にdomainを含めるようにできたほうが便利だ。
さらに、domainや起動スクリプトや依存しているjar等をまとめてzipにパッケージングし、ビルドするだけで即配布可能な状態にする。

なお、今回の内容をまとめたサンプルプロジェクトをGitHubで公開している。

- https://github.com/masaha03/payara-embedded-sample

# 方法
前回の投稿と同じプロジェクト構成を用いる。

```
payara-embedded-sample
├── payara-emmbeded-sample-app
└── payara-emmbeded-sample-main
```

## domainと起動スクリプトを構成する
Application Assembler Maven Pluginを使う。

- Application Assembler Maven Plugin http://www.mojohaus.org/appassembler/appassembler-maven-plugin/

このプラグインの主な目的は、依存ライブラリのリポジトリ化と、それら依存ライブラリのclasspathを設定した起動スクリプトを生成することである。classpath起動スクリプトにはそれに付随して、その他のファイル等をバンドルする機能もある。
まず、`payara-emmbeded-sample-main`モジュールにdomainのディレクトリを追加し、以下のような構成にする。

```
payara-embedded-sample-main
└── src
        └── main
                ├── config
                │      └── domain
                └── java
```

次にpom.xmlに以下を加える。

```xml: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/xsd/maven-4.0.0.xsd">
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>assemble</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <configurationDirectory>config</configurationDirectory>
                    <copyConfigurationDirectory>true</copyConfigurationDirectory>
                    <programs>
                        <program>
                            <mainClass>jp.mshackers.payara.embedded.sample.PayaraEmbedded</mainClass>
                            <id>embedded</id>
                        </program>
                    </programs>
                </configuration>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>
```

これだけで、packageを走らせたときに`config`ディレクトリのコピーと起動スクリプトの生成を行ってくれる。

## zipにパッケージングする
Assembly Pluginを使うだけなので、特に目新しいところはない。前項に加え、`payara-embedded-sample-main`モジュールを以下のように構成する。

```
payara-embedded-sample-main
└── src
        └── main
                ├── assembly
                │      └── bin.xml
                ├── config
                └── java
```

`bin.xml`にはAssembly Pluginの設定を書く。これはdescriptorと呼ばれる。今回は、特定のディレクトリをzipにパッケージングするだけなので、非常に単純。

```xml:bin.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/appassembler</directory>
        </fileSet>
    </fileSets>
</assembly>
```
次に、pom.xmlにAssembly Pluginの設定を書く。これも単純で、上記のdescriptorを設定するだけ。

```xml: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/xsd/maven-4.0.0.xsd">
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/bin.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>
```

# 実行環境

```bash:
$ date
2015年 10月 4日 日曜日 20時55分48秒 JST
$ mvn --version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T20:57:37+09:00)
Maven home: /usr/local/Cellar/maven/3.3.3/libexec
Java version: 1.8.0_40, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"
$ java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F27
```

# 関連する記事

- [GlassFish/Payara Embeddedとwarをまとめてパッケージングする](http://qiita.com/masaha03/items/d9433e074a1ea7e23c6b)