MavenのArchetypesについて

環境

$ mvn --version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.11, 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-89-generic", arch: "amd64", family: "unix"

Archetypeとは?

  • シンプルに言うと、プロジェクトのテンプレートツールキットのこと
  • 組織はArchetypeを使うことで、プロジェクトのベストプラクティスに従った構成をすばやく構築できる
  • Archetypeは既存で定義されているものもあるし、自分で定義して配布することもできる

Maven Archetype Pluginとは?

使ってみる

  • Project creation を参考に使ってみる
  • 通常、archetypeはリモートリポジトリから取得される
    • 特に設定がされていなければCentralRepositoryが参照されるはず
    • それ以外のリポジトリを参照したければ settings.xml などで定義すること
  • archetype:generateインタラクティブモードでプロジェクトの生成を開始できる
    • 出力の一部がドキュメント違うので、ドキュメントは少し古いのかもしれない
$ mvn archetype:generate
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> am.ik.archetype:elm-spring-boot-blank-archetype (Blank multi project for Spring Boot + Elm)
2: remote -> am.ik.archetype:graalvm-blank-archetype (Blank project for GraalVM)
3: remote -> am.ik.archetype:graalvm-springmvc-blank-archetype (Blank project for GraalVM + Spring MVC)
4: remote -> am.ik.archetype:graalvm-springwebflux-blank-archetype (Blank project for GraalVM + Spring MVC)
5: remote -> am.ik.archetype:maven-reactjs-blank-archetype (Blank Project for React.js)
6: remote -> am.ik.archetype:msgpack-rpc-jersey-blank-archetype (Blank Project for Spring Boot + Jersey)
~~ 以下略 ~~
  • インタラクティブモードでは大量にarchetypeが出力される
  • 最終的に次のような文言とともにユーザーの入力待機状態となる
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):
  • この状態で、特定のarchetypeの番号を入力すると、プロジェクトの作成に移る
  • また、大量のarchetypeをフィルタして再表示させることもできる
    • フィルタのフォーマットは文言通り、 [groupId:]artifactId となる
    • 例えば org.apache: とすると、groupIdが一致するものがフィルタされ表示される
    • また simple とすると、artifactIdにsimpleが含まれるものがフィルタされ表示される
    • さらに org.apache:simple とすると、groupIdが org.apache でartifactIdに simple が含まれるものがフィルタされ表示される
  • 例えば次のような出力になる
    • 一覧表示させながら絞り込んでいきたい時、この機能は役立ちそうだ
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : org.apache:simple
Choose archetype:
1: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with both Flash and JavaScript output.)
2: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-pure-js-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with only JavaScript output.)
3: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-pure-swf-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with only Flash output.)
4: remote -> org.apache.flex.flexjs.framework:flexjs-simple-library-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS library.)
5: remote -> org.apache.flex.flexjs.framework:flexjs-simple-typedef-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS typedef library.)
~~ 以下略 ~~
  • さらに、 -Dfilter で最初からフィルタを指定して表示させることもできる
  • 例えば以下の通り
$ mvn archetype:generate -Dfilter=org.apache:simple
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with both Flash and JavaScript output.)
2: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-pure-js-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with only JavaScript output.)
3: remote -> org.apache.flex.flexjs.framework:flexjs-simple-application-pure-swf-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS application with only Flash output.)
4: remote -> org.apache.flex.flexjs.framework:flexjs-simple-library-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS library.)
5: remote -> org.apache.flex.flexjs.framework:flexjs-simple-typedef-archetype (Maven archetype for creating FlexJS Maven project for building a simple FlexJS typedef library.)
~~ 以下略 ~~
  • ここでarchetypeを選んだら、必要なプロパティ(groupId,artifactId,versionなど)を入力してプロジェクトを作成する
  • 例えば以下の通り
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 9
Choose org.apache.maven.archetypes:maven-archetype-simple version: 
1: 1.3
2: 1.4
Choose a number: 2: 
Define value for property 'groupId': org.demo
Define value for property 'artifactId': simple
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' org.demo: : 
Confirm properties configuration:
groupId: org.demo
artifactId: simple
version: 1.0-SNAPSHOT
package: org.demo
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-simple:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.demo
[INFO] Parameter: artifactId, Value: simple
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.demo
[INFO] Parameter: packageInPathFormat, Value: org/demo
[INFO] Parameter: package, Value: org.demo
[INFO] Parameter: groupId, Value: org.demo
[INFO] Parameter: artifactId, Value: simple
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Project created from Archetype in dir: /home/bookstore/IdeaProjects/demo-maven-archetype/simple
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:51 min
[INFO] Finished at: 2021-11-07T16:52:51+09:00
[INFO] ------------------------------------------------------------------------
$ tree .
.
└── simple
    ├── pom.xml
    └── src
        ├── main
        │   └── java
        │       └── org
        │           └── demo
        │               └── App.java
        ├── site
        │   └── site.xml
        └── test
            └── java
                └── org
                    └── demo
                        └── AppTest.java

11 directories, 4 files
  • pom.xml は以下の内容
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.demo</groupId>
  <artifactId>simple</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>simple</name>
  <description>A simple simple.</description>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>
</project>

バッチモードでプロジェクトを作成する

  • 上記のように、インタラクティブにプロジェクトを作ることもできるが、時には必要なプロパティを最初から指定したいときもある
  • そんなときはバッチモードが使用できる
    • Generate project in batch mode
    • -B をつけるとバッチモードでプラグインが起動する
    • 必要なプロパティをそれぞれ -D で渡す
      • archetypeGroupId, archetypeArtifactId, archetypeVersion はarchetypeによらず必要になる
      • groupId, artifactId, version, package もそれぞれ必要となるがそれ以外にも必要なプロパティがある場合がある
        • 詳しくはarchetypeのドキュメントを読めとのこと
  • 具体的には下記のようにして使用する
$ mvn archetype:generate -B \
> -DarchetypeGroupId=org.apache.maven.archetypes \
> -DarchetypeArtifactId=maven-archetype-simple \
> -DarchetypeVersion=1.4 \
> -DgroupId=org.demo \
> -DartifactId=archetype \
> -Dversion=SNAPSHOT-1.0 \
> -Dpackage=org.demo
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-simple:1.4] found in catalog remote
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-simple:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.demo
[INFO] Parameter: artifactId, Value: archetype
[INFO] Parameter: version, Value: SNAPSHOT-1.0
[INFO] Parameter: package, Value: org.demo
[INFO] Parameter: packageInPathFormat, Value: org/demo
[INFO] Parameter: package, Value: org.demo
[INFO] Parameter: groupId, Value: org.demo
[INFO] Parameter: artifactId, Value: archetype
[INFO] Parameter: version, Value: SNAPSHOT-1.0
[INFO] Project created from Archetype in dir: /home/bookstore/IdeaProjects/demo-maven-archetype/archetype
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.684 s
[INFO] Finished at: 2021-11-09T14:00:27+09:00
[INFO] ------------------------------------------------------------------------