maven-archetype-plugin と archetype-catalog.xml 生成場所/読み取り場所
(注: 文中に記載の localRepository 設定有無、というのは間違った条件かも知れません(検証中))
問題
mvn archetype:generate -DarchetypeCatalog=local コマンドを実行したところ、次のようなメッセージが出力され、 archetype-catalog.xml を認識できていないような感じでしたので原因を調べてみました。
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
Your filter doesn't match any archetype (hint: enter to return to initial list)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :
調査内容
使用した Maven のバージョンは、現時点での最新バージョンである 3.5.2 です。
自作の maven-archetype-java-quickstart を用い、次の 3 パターンを試しました。
- plugin を明示しない -
masterブランチ - plugin 最新バージョン
3.0.1を明示する -feature/test-maven-archetype-pluginブランチ - plugin
2.4バージョンを明示する - 上のfeature/test-maven-archetype-pluginを書き換え
また、 settings.xml での localRepository 設定の有無でも結果が変わりましたのでそれらをまとめます。
調査結果
まず、 mvn archetype:update-local-catalog コマンドで archetype-catalog.xml が生成される場所です。
| plugin未設定 | 2.4 | 3.0.1 | |
|---|---|---|---|
| localRepository設定無し | ~/.m2/ | ~/.m2/ | ~/.m2/repository/ |
| localRepository設定有り | {localRepository}/ | ~/.m2/ | {localRepository}/ |
plugin を明示しない場合、一貫していません。
次に、 mvn archetype:generate -DarchetypeCatalog=local コマンド実行時にどの場所にある archetype-catalog.xml を読んでいるのかを調べました。
| localRepository設定無し | ~/.m2/ |
| localRepository設定有り | {localRepository}/ |
まとめ
localRepository設定を行ってない場合、~/.m2/archetype-catalog.xmlを読みに行こうとするので3.0.1を使用したプロジェクトを読み取れない。localRepository設定を行っている場合、{localRepository}/archetype-catalog.xmlを読みに行こうとするので2.4を使用したプロジェクトを読み取れない。
という結果になりました。
localRepository 設定有無で archetype-catalog.xml を読み取る場所に一貫性が無い、というのが根本原因だと思われますが、結果的には、 maven-archetype-plugin を明示していない(私のプロジェクトのような)場合問題が起きない、ということになります。