👌

[Java]Mavenでpom.xmlのAnt連携の記述を読み解く

に公開

MavenとAntの融合:maven-antrun-plugin の仕組みをやさしく解説

はじめに

JavaやSpring Bootで開発していると、pom.xml にこんな設定を見かけたことはありませんか?

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>concat-css</id>
      <phase>process-resources</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <mkdir dir="target/classes/static/css/common"/>
          <concat destfile="target/classes/static/css/common/common.css" encoding="UTF-8">
            <fileset dir="src/main/resources/static/css/foundation">
              <include name="*.css"/>
            </fileset>
          </concat>
          <echo message="common.css を結合しました。" level="info"/>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

この記事では、MavenとAntの連携をやさしく解説します。


1. MavenとAntの関係

MavenとAntはどちらも「ビルドツール」ですが、設計思想が違います。

ツール 特徴
Ant タスクをXMLで順番に書くスクリプト方式
Maven 「フェーズ」ごとにプラグインを登録して自動処理する方式

Mavenでは、ビルドの流れ(ライフサイクル)があらかじめ定義されており、
各フェーズでどのプラグインを実行するかを設定します。


2. antrun:run の正体

antrun はどこから来た?

実は antrun:run の正式なプラグイン名はこうです:

org.apache.maven.plugins:maven-antrun-plugin:run

Mavenでは、maven-〇〇-plugin の形式のプラグインは短縮して呼べるルールがあります。

正式名称 短縮形
maven-compiler-plugin compiler
maven-surefire-plugin surefire
maven-antrun-plugin antrun

つまり、antrun:runmaven-antrun-pluginrun ゴールを呼び出している、という意味です。


3. goal(ゴール)とは?

Mavenのプラグインは「ゴール」と呼ばれる実行単位を持っています。

  • <goal>run</goal> は「runという処理を呼ぶ」という意味。
  • このrunは任意の文字ではなく、プラグイン側で定義されている固定名称です。

実際に maven-antrun-plugin の中では、次のように定義されています。

@Mojo(name = "run", defaultPhase = LifecyclePhase.PROCESS_RESOURCES)
public class AntRunMojo extends AbstractMojo {
    public void execute() throws MojoExecutionException {
        // Antエンジンを起動し、<target> を実行する
    }
}

4. Mojoとは何か?

Mojo(モジョ) は “Maven plain Old Java Object” の略です。
POJO(Plain Old Java Object)をもじった言葉で、
「Mavenプラグインを構成するJavaクラス」 のことを指します。

つまり:

概念 役割
Plugin 複数のMojoの集合
Goal 各Mojoクラスの機能名
Mojo 実際に処理を実装したJavaクラス

たとえば、maven-antrun-pluginrun ゴールは、
AntRunMojo というクラスによって実装されています。


5. <target> が動く仕組み

では、AntRunMojoexecute() に引数がないのに、どうやって <target> の内容を実行しているのでしょう?

その答えは、Mavenの設定注入(Configuration Injection) です。

Mavenは、POMファイルの <configuration> 部分を、
プラグイン内部のJavaフィールドに自動的にバインドします。

@Parameter
private Target target;

このように定義されていれば、POMで書かれた <target> ... </target> が自動的に Target オブジェクトとして入ります。

そして execute() の中で:

target.execute();

と呼ぶことで、Antエンジンが <mkdir><concat> を順に実行するのです。


6. 実際の処理の流れ

  1. Mavenが AntRunMojo のインスタンスを生成
  2. <configuration> 内のXMLを target フィールドに注入
  3. Mavenが execute() を呼び出す
  4. target.execute() がAntエンジンを起動
  5. <mkdir><concat><echo> が順に実行される

7. Antタスクとの対応関係

XML要素 対応するAntクラス 役割
<target> org.apache.tools.ant.Target タスクの集合
<mkdir> org.apache.tools.ant.taskdefs.Mkdir ディレクトリ作成
<concat> org.apache.tools.ant.taskdefs.Concat ファイル結合
<echo> org.apache.tools.ant.taskdefs.Echo メッセージ出力

8. まとめ

項目 意味
<phase> どのビルドフェーズで実行するか
<goal> プラグイン内の処理名(固定)
<id> 実行ブロックの識別子(任意)
<target> 実際にAntで動かすスクリプト内容

つまりこの設定はこう読むのが正確です:

Mavenの process-resources フェーズで、
maven-antrun-pluginrun ゴールを実行し、
その中で <target> に書かれたAntタスクを順に実行する。


おわりに

この記事では、maven-antrun-plugin がどのように動作しているのか、
そして Mojo<goal><target> の関係を解説しました。

これを理解できれば、pom.xml に書かれたプラグイン設定が
「どこで・いつ・どう動いているのか」を読み解けるようになります。


補足メモ:
Spring Bootを使っている場合、Antrunタスクはビルド時(mvn packageなど)に動作します。
Tomcat起動時には自動では実行されないため、
フェーズを generate-resources に変更すると起動時にも自動実行されます。

株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion