その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Maven Archetype で文字列を置換したりする

Maven Archetypearchetype を作るとき,文字列を置換したくなることがあります.
例えば $artifactIdfoo-bar と入っている時にこれを foo_bar という風に s/-/_/g したくなる事などがあるでしょう.世の中色々あるのです.

そういう時は以下のように書いてやると良い.

${artifactId.replaceAll("-", "_")}

こういう感じで普通に replaceAll() 等の String のインスタンスメソッドを呼び出すことが出来るので便利.


でもって pom.xml

#set($replaced = $artifactId.replaceAll("-", "_"))

とか書いてやると,archetype 内で $replaced という変数が置換後の内容として使えるようになるので便利!!


現場からは以上です.

Java で新しくプロジェクトを始めるときに何を使ってセットアップすべきか

Java で新しいプロジェクトを立ち上げる時,

という2つの方法が考えられると思います (他にもあるかも知れない).
さてどちらが良いのか.

Maven Archetype を使う

利点
  • mvn さえマシンに入っていれば OK (他の処理系がいらない)
  • Maven Central (社内に立ってるようなミラーを含む) に archetype が上がっていると明示的なインストール等が無く使えるので便利
    • 配布が楽!!!!!!
    • 簡単に使える
      • アップロードされている場合,以下のようにするとセットアップできる
mvn archetype:generate -DarchetypeGroupId=com.example -DarchetypeArtifactId=sample-archetype -DarchetypeVersion=1.0.0
欠点
  • Archetype 作るのは色々とだるい (独自のルールとか.まあこれは仕方がないので慣れるしか無い,何回かやると慣れる)
  • 凝ったこと (例えば,コマンドライン引数に応じてファイルの出しわけをするとか) をしようとすると詰む
  • 処理が重い (諦める)

セットアップスクリプトを使う

利点
  • 自由度が高い
    • 例えば上に書いたコマンドライン引数に応じてファイルの出しわけをする (--adminオプションを付けると,管理画面用の雛形が追加されるみたいな) とかが簡単に実現できる
  • ルールに縛られず自分の好きなように作れるので作りやすい
欠点
  • 実行に際して別途セットアップスクリプトの為の処理系が必要
  • 配布が面倒くさい
    • セットアップスクリプトをどこに置くか
    • どうやってインストールするのか
    • 簡単に使えるのか

所感

とりあえず通常の場合は Maven Archetype を使っていくのが良いような気がします.
Java のプロジェクトをやろう!」という人のマシンには間違いなく mvn は入っているでしょうし,なにより archetype配布や実行が楽だからです.Maven Archetype は凝ったことをしない限り戦っていくことが可能です.
配布や実行が楽というのは本当に重要であります.この辺が面倒くさいと誰も使わないし,保守するモチベーションも死んでゆくし,その結果いくら良い雛形であっても滅亡してゆきます.ので,ここは本当に重要.
処理が重いというのはありますが,絶望的に重いわけではないのでここらへんは割り切っていきましょう.そんな頻繁に叩くものでもないので.


Maven Archetype では無理だ!」というレベルの凝ったことをしたくなった時には独自のセットアップスクリプトを用意するくらいで良いという意識になっています.
この場合,セットアップスクリプトをどこに置くかという問題はありますが,そのあたりは GitHub Releases とか,Jenkins の成果物とか,まあいくらでもやりようはあるのかなと思っています.
(雑考: ここらへんに golang を使っていくというアプローチはどうか.ビルド済みのバイナリを然るべき場にソイヤしておくと,各位が適宜エイヤできる気がする)


archetype の作成はだるい,というのはまああるにはあるんですが,セットアップスクリプトを作る場合も結局は面倒なので,この辺は支配的な差にはならないように感じています.


Maven Archetype,最初はその風貌や名前からウッアッという感じになるんですが,慣れると何とかなります.
ひとまずこれで良いんじゃないですかね.