Maven Archetype Pluginを直接使って、Nablarchのブランクプロジェクトを作成する

# What's？

Nablarchのブランクプロジェクトを、Maven Archetype Pluginを直接使って作成する方法をメモしよう、ということで。


# Nablarchのブランクプロジェクト

Nablarchのブランクプロジェクトについては、こちらにドキュメントがあります。

[ブランクプロジェクト](https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/blank_project/index.html)

[初期セットアップ手順](https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/blank_project/FirstStep.html)

[初期セットアップ手順（コンテナ）](https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/blank_project/FirstStepContainer.html)

ブランクプロジェクトの作成方法としては、Windowsバッチファイルをダウンロードして実行すること、と書かれています。

ですが、Linux環境だと困りますし、バッチファイルを開いて手順を確認するのものなぁと思ってメモしようかなと。

ちなみに、Nablarch 5u18でのコンテナ用RESTfulウェブサービスのブランクプロジェクト作成のためのWindowsバッチファイルは、こんな感じです。

```shell
$ curl https://nablarch.github.io/docs/5u18/doc/_downloads/generateContainerWebServiceProject.bat
if "%5" EQU "" (
  set package=%2
) else (
  set package=%5
)

mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DinteractiveMode=false -DarchetypeGroupId=com.nablarch.archetype -DarchetypeArtifactId=nablarch-container-jaxrs-archetype -DarchetypeVersion=%1 -DgroupId=%2 -DartifactId=%3 -Dversion=%4 -Dpackage=%package%
```

まあ、この中を埋めていくだけの話ではあるのですが、もう少し情報を整理しようかなと。


# 環境

今回の環境は、こちら。

```shell
$ java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.9.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-54-generic", arch: "amd64", family: "unix"
```

Nablarchは、現時点での最新版5u18を使用します。

```shell
$ curl -s https://api.github.com/repos/nablarch/nablarch-profiles/releases/latest | jq -r '.tag_name'
5u18
```

# Nablarchのアーキタイプの一覧を表示する

まずは、アーキタイプの一覧を確認したいところです。

ブランクプロジェクトの作成自体はMaven Archetype Plugin 2.4で行いますが、一覧の取得は最新版で行うことになります。

以下のコマンドで、結果を絞り込みましょう。

```shell
$ mvn archetype:generate \
  -DarchetypeGroupId=com.nablarch.archetype \
  -Dfilter=nablarch | grep nablarch-
```

こんな感じで結果が取得できます。コマンド入力待ちになっているので、Ctrl-cで終了してください。

```shell
1: remote -> com.nablarch.archetype:nablarch-batch-archetype (Nablarch Framework.)
2: remote -> com.nablarch.archetype:nablarch-batch-ee-archetype (Nablarch Framework.)
3: remote -> com.nablarch.archetype:nablarch-container-jaxrs-archetype (Nablarch Framework.)
4: remote -> com.nablarch.archetype:nablarch-container-web-archetype (Nablarch Framework.)
5: remote -> com.nablarch.archetype:nablarch-jaxrs-archetype (Nablarch Framework.)
6: remote -> com.nablarch.archetype:nablarch-web-archetype (Nablarch Framework.)
```

アーキタイプ名は、`nablarch-web-archetype`などの部分を使用します。

Maven Archetype Pluginのドキュメントの、以下の部分を使っている感じですね。

> Filtering to reduce archetype list

[Project creation / Usage](https://maven.apache.org/archetype/maven-archetype-plugin/usage.html)

アーキタイプと対応するアプリケーションの種類は、名前を見たらまあわかるでしょう。


# ブランクプロジェクトを作成する

では、アーキタイプを選んでプロジェクトを作成しましょう。

プロジェクト作成の際には、`org.apache.maven.plugins:maven-archetype-plugin:2.4:generate`を指定します。

```shell
$ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=com.nablarch.archetype \
  -DarchetypeArtifactId=[使用するNablarchのブランクプロジェクト用のアーキタイプ] \
  -DarchetypeVersion=[使用するNablarchのバージョン] \
  -DgroupId=[作成するプロジェクトのグループID] \
  -DartifactId=[作成するプロジェクトのアーティファクトID] \
  -Dversion=[作成するプロジェクトのバージョン] \
  -Dpackage=[作成するプロジェクトのパッケージ名]
```

具体的な例でいくと、こんな感じですね。

```shell
$ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=com.nablarch.archetype \
  -DarchetypeArtifactId=nablarch-container-jaxrs-archetype \
  -DarchetypeVersion=5u18 \
  -DgroupId=com.example \
  -DartifactId=hello-restful-web \
  -Dversion=0.0.1 \
  -Dpackage=com.example.restful
```

ここでは、以下の条件で作成。

* アーキタイプ … `nablarch-container-jaxrs-archetype`
* Nablarchのバージョン … `5u18`
* 作成するプロジェクトのグループID … `com.example`
* 作成するプロジェクトのアーティファクトID … `hello-restful-web`
* 作成するプロジェクトのバージョン … `0.0.1`
* 作成するプロジェクトのパッケージ … `com.example.restful`

指定情報は、こんな感じで表示されます。

```shell
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: nablarch-container-jaxrs-archetype:5u18
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: hello-restful-web
[INFO] Parameter: version, Value: 0.0.1
[INFO] Parameter: package, Value: com.example.restful
[INFO] Parameter: packageInPathFormat, Value: com/example/restful
[INFO] Parameter: package, Value: com.example.restful
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: hello-restful-web
[INFO] Parameter: version, Value: 0.0.1
[INFO] project created from Archetype in dir: /path/to/hello-restful-web
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.466 s
[INFO] Finished at: 2020-11-23T16:11:16+09:00
[INFO] ------------------------------------------------------------------------
```

あとは、プロジェクト内に移動して作業を進めましょう。

```shell
$ cd hello-restful-web
```

`nablarch-container-jaxrs-archetype`を選んだ場合に、作成されたファイルはこちら。

```shell
$ find -type f
./README.md
./pom.xml
./.gitignore
./h2/bin/h2-1.3.176.jar
./h2/bin/h2w.bat
./h2/bin/h2.sh
./h2/bin/h2.bat
./h2/db/SAMPLE.h2.db
./h2/db/SAMPLE.h2.db.org
./db/ddl/db2/create.sql
./db/ddl/db2/drop.sql
./db/ddl/sqlserver/create.sql
./db/ddl/sqlserver/drop.sql
./db/ddl/oracle/create.sql
./db/ddl/oracle/drop.sql
./db/ddl/postgresql/create.sql
./db/ddl/postgresql/drop.sql
./db/ddl/h2/create.sql
./db/ddl/h2/drop.sql
./db/data/db2/data.sql
./db/data/sqlserver/data.sql
./db/data/oracle/data.sql
./db/data/postgresql/data.sql
./db/data/h2/data.sql
./src/main/webapp/WEB-INF/web.xml
./src/main/resources/entity/data-model_sqlserver.edm
./src/main/resources/entity/data-model.edm
./src/main/resources/entity/data-model_postgresql.edm
./src/main/resources/entity/data-model_db2.edm
./src/main/resources/entity/data-model_oracle.edm
./src/main/resources/rest-boot.xml
./src/main/resources/env.config
./src/main/resources/META-INF/services/nablarch.core.repository.di.config.externalize.ExternalizedComponentDefinitionLoader
./src/main/resources/rest-component-configuration.xml
./src/main/resources/messages.properties
./src/main/resources/data-source.xml
./src/main/resources/log.properties
./src/main/resources/app-log.properties
./src/main/resources/common.config
./src/main/jib/usr/local/tomcat/conf/server.xml
./src/main/jib/usr/local/tomcat/conf/logging.properties
./src/main/java/com/example/restful/entity/package-info.java
./src/main/java/com/example/restful/entity/SampleUser.java
./src/main/java/com/example/restful/package-info.java
./src/main/java/com/example/restful/domain/package-info.java
./src/main/java/com/example/restful/domain/SampleDomainBean.java
./src/main/java/com/example/restful/domain/SampleDomainManager.java
./src/main/java/com/example/restful/SampleAction.java
./src/main/java/com/example/restful/dto/SampleUserListDto.java
./src/test/resources/log.properties
./src/test/resources/unit-test.xml
./src/test/resources/data/SAMPLE_USER.csv
./src/test/java/com/example/restful/SampleApiTest.java
./src/test/java/com/example/restful/SampleActionTest.java
```


# オマケ

最新のNablarchを指定してプロジェクトを作成したい場合は、アーキタイプのリポジトリのリリースバージョンを使うと良いでしょう。

```shell
$ LATEST_NABLARCH_VERSION=`curl -s https://api.github.com/repos/nablarch/nablarch-single-module-archetype/releases/latest | jq -r '.tag_name'`
$ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=com.nablarch.archetype \
  -DarchetypeArtifactId=${LATEST_NABLARCH_VERSION} \
  -DarchetypeVersion=[使用するNablarchのバージョン] \
  -DgroupId=[作成するプロジェクトのグループID] \
  -DartifactId=[作成するプロジェクトのアーティファクトID] \
  -Dversion=[作成するプロジェクトのバージョン] \
  -Dpackage=[作成するプロジェクトのパッケージ名]
```

あとは、`parent`や`profiles`からも同じリリースバージョンが取得できますね。

[nablarch-parent](https://github.com/nablarch/nablarch-parent)

[nablarch-profiles](https://github.com/nablarch/nablarch-profiles)