[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:run は maven-antrun-plugin の run ゴールを呼び出している、という意味です。
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-plugin の run ゴールは、
AntRunMojo というクラスによって実装されています。
5. <target> が動く仕組み
では、AntRunMojo の execute() に引数がないのに、どうやって <target> の内容を実行しているのでしょう?
その答えは、Mavenの設定注入(Configuration Injection) です。
Mavenは、POMファイルの <configuration> 部分を、
プラグイン内部のJavaフィールドに自動的にバインドします。
@Parameter
private Target target;
このように定義されていれば、POMで書かれた <target> ... </target> が自動的に Target オブジェクトとして入ります。
そして execute() の中で:
target.execute();
と呼ぶことで、Antエンジンが <mkdir> や <concat> を順に実行するのです。
6. 実際の処理の流れ
- Mavenが
AntRunMojoのインスタンスを生成 -
<configuration>内のXMLをtargetフィールドに注入 - Mavenが
execute()を呼び出す -
target.execute()がAntエンジンを起動 -
<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-pluginのrunゴールを実行し、
その中で<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スキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion