Maven Archetype メモ

最近、いろいろテストやチュートリアルの学習用にsimple spring web mavenをベースに独自のパッケージ構成や、フォルダ構成にした上で使う場合が多いのですが、さすがに毎回の作業は手間です。
そこで、雛形を作成するようなものはないかと調べてみると、Archetypeを独自に作成することが出来るらしい。
・・というわけで、いろいろやってみたことのメモです(あくまで、自分用のメモです)。

  • IDEは、STS3.9.6
  • 作業したMavenのバージョンは3.5.4(Mavenのインストール等は割愛)。
  • web.xml<display-name></display-name>artifactIdを挿入する。
  • パッケージの構成を、groupId.artifactIdみたいにする。
  • src/resources配下に、artifactIdを冠するファイルを配置したい。
  • etc..

空のArchetypeの作成

  • -DarchetypeArtifactId=maven-archetype-archetype:Mavenが提供している新しいカスタムarchetypeを作成するためのArchetype。

  • 出来上がったディレクトリ、spring-web-customに移動し、mvn eclipse:eclipseコマンドを発行して、eclipseで使えるようにする。

  • Eclipseにインポートする。

Eclipse上での作業

インポート直後のフォルダ構成

  • 雛形は、archetype-resources/以下に作っていく。

最終的にプロジェクトに展開した際のフォルダ構成を、このようにしたい。

雛形にファイルやディレクトリを配置していく。pom.xmlは、archetype-resources/直下のpomを編集する。

最終的に出力されるパッケージのフォルダ構成と、雛形で作成しているフォルダ構成の違いに注意。

その辺は、後でarchetype.xml(実際にはarchetype-metadata.xml)で設定をする。

archetype-metadata.xmlの編集

雛形を作成した当初は、archetype.xmlとなっているが、名前をarchetype-metadata.xml に変えて、内容を全て消去し、次のようにする。

の設定

archetype-metadata.xmlにプロパティを設定する。

  • プロパティに値を設定しておくことで、ファイル名や、ファイル中のテキストに値を展開できる。
  • この例では、projectName、packages、groupIdToPathに値を設定しています。

例えば、ファイル名に__projectName__-domain.xmlとしておけば、最終展開されたときに、someapplication-domain.xmlと展開される。

また、ファイル中の${projectName}とされている部分も、someapplicationと展開される。例として、あるBean定義ファイルの中の:

は、

という形で展開される。

上記プロパティの中で、groupIdToPathは、本来であれば${groupId.replaceAll("\\.", "/")}とすればいいのかもしれないが、バグが有るために意図通りに処理されない。(参照Required property default value incorrect when using system property
このリンクには、修正パッチがある(時間の都合で試していない)。

の設定

番号 説明
(1) filteredpackagedencodingの各属性がある。
(2) プロパティのキーを__(アンダーバー2つ)で囲むことで、値に変換される。(${artifactId}は、その文字のままになる)
(3) 何も指定していないと、空のディレクトリはコピーされないが、このように明示しておくことで、空のディレクトリもコピーされる。
(4) 指定されているディレクトリ内の、全てのディレクトリの配下にある全てのディレクトリ、ファイル。

各属性について

属性 タイプ 説明
filtered boolean trueとすることで、ファイルセットをVelocityテンプレートとしてフィルタリングして、プロパティの値に置き換えられます。falseの場合は、何も変更が加えられず、ただ単にコピーされます。
デフォルトはtrue
packaged boolean trueとすることで、選択されたファイルは${package}プロパティで表されるディレクトリ構造内にコピーされます。今回の例の場合、パッケージ名はcom.example.someapplicationなので、ディレクトリ、com/example/sommeaplication/(存在しない場合は、ディレクトリが作成される)にコピーされる。
デフォルトはfalse
encoding String 内容をフィルタリングする際のエンコーディング
雛形に配置している.javaファイルの内容

  • この${package}は、com.example.someapplicationと展開される。

実際の雛形では、src/main/java/App.javaとなっているが、${package}で指定して、<fileset>filtered="true"とすることで、プロジェクトに展開したときに、src/main/java/com/example/someapplication/App.javaに配置される。

  • HelloController.javaは、${package}.appとすることで、相対的なパッケージ名になるようにしている。

ローカルリポジトリにインストール

作成したArchetypeをベースにプロジェクト作成