Maven Archetypeの作成方法と利用方法

概要

mvn archetype:create-from-package コマンドで既存のプロジェクトからArchetypeを生成することができるが、 Mavenプロジェクト生成時に指定したPackage名に変更する必要がある。

ソースコードはこちら github.com

Archetypeの生成

1. 既存のMavenプロジェクトから一旦作成

$ mvn archetype:create-from-project

2. ソースファイル内のpackage名の修正

target/generated-sources/archetype/target/classes/archetype-resources/src/main/java/App.java ファイル内の pacakge Samplepackage ${package} に変更する

#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package Sample;

/**

から以下に変更する

#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package ${package};  

/**

これによってMavenプロジェクト生成時に指定したPackage名に変更される。

Note: ${package} プロパティのデフォルト値を定義できる

生成されたtarget/generated-sources/archetype/target/classes/META-INF/maven/archetype-metadata.xml ファイルにて 以下のように<requiredProperty> 項目にプロパティの初期値を定義することができる。

<archetype-descriptor
    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd">

    <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <directory>src/main/java</directory>
        </fileSet>
    </fileSets>

    <requiredProperties>
        <requiredProperty key="package">
            <defaultValue>${groupId}.${artifactId}.mypackage</defaultValue>
        </requiredProperty>
    </requiredProperties>

</archetype-descriptor>

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

$ cd target/generated-sources/archetype/
$ mvn install

Mavenプロジェクトの生成

$ mvn archetype:generate -DarchetypeCatalog=local -DarchetypeGroupId=io.github.yossan -DarchetypeArtifactId=maven-quickstart-archetype
  • -DarchetypeCatalog=local これによってローカルリポジトリからArchetypeを検索するので非常に早くなる
  • -DarchetypeGroupId 既存のプロジェクトから生成した場合、同一
  • -DarchetypeArtifactId 既存のプロジェクトから生成した場合、後ろに -archetype がくっついているので注意

参考

ソースコード内のPakcage名をMavenプロジェクト生成時に指定した名前に変更する方法

Change package property in Maven Archetype - Stack Overflow

Maven Archetype Descriptor Model – ArchetypeDescriptor

Archetypeにおいて$は特別な意味を持つため、エスケープする必要がある

Prevent Maven from removing $ (dollar sign) from archetype resources? - Stack Overflow

-DarchetypeCatalog=localを一緒に指定するとローカルリポジトリ内部での検索となり非常に早くなる

maven archetype:generate does not find archetype in local catalog - Stack Overflow