JavaのビルドツールMavenの基礎知識と簡単なプロジェクトを作成するまでのチュートリアル

photo of person typing on computer keyboard

Javaのビルドツールとして一定のシェアを保っているMavenについての基礎知識と,Mavenで簡単なプロジェクトを作成するまでのチュートリアルです.

目次

Mavenの基礎知識

Mavenが誕生した背景

  • AntはJavaの世界で広く普及した最初のビルドツール
    • Javaのプロジェクトが大規模化するにあたって、Antの限界が見えてきた
  • Antはビルドに関する作業だけを行うツールだった
    • プログラムのテスト、Javadocの生成等を行うと複雑化

Mavenの特徴

  • XMLでビルドファイルを記述
  • ゴールによる目的の指定
    • ゴールを記述すれば必要な作業はMavenが自動的に進める。
  • ライブラリ管理とセントラルレポジトリ
    • Mavenはプロジェクトの依存関係を解消し、必要なライブラリを自動的にインストールする。
    • 他のJavaビルドツールもMavenセントラルリポジトリを利用出来る。
    • Javaのライブラリの中心地
  • テスト、ドキュメントの生成
  • プラグインによる拡張

Mavenのインストール

brew経由でインストールします。

% brew install maven

動作確認をします。

% mvn -v
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /opt/homebrew/Cellar/maven/3.8.6/libexec
Java version: 18.0.1.1, vendor: Oracle Corporation, runtime: /Users/takuya/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home
Default locale: en_JP, platform encoding: UTF-8
OS name: "mac os x", version: "13.1", arch: "aarch64", family: "mac"

Mavenプロジェクトの作成

手作業でプロジェクトのフォルダとファイルを作成することも出来ますが、Mavenに用意されている「archetype:generate」というゴールを利用することで簡単にプロジェクトの基本部分が作成できます。

作業フォルダの作成

% mkdir maven_practice
% cd maven_practice

Mavenのプロジェクトフォルダの作成

% mvn archetype:generate

アーキタイプ一覧が大量に出力されます。アーキタイプはプログラムのテンプレート集です。ここで選択したアーキタイプのプロジェクトが作成されます。デフォルトではmaven-archetype-quickstartが選択されています。このままEnterして進めます。

3189: remote -> uk.co.solong:angular-spring-archetype (So Long archetype for RESTful spring services with an AngularJS frontend. Includes debian deployment)
3190: remote -> us.fatehi:schemacrawler-archetype-maven-project (-)
3191: remote -> us.fatehi:schemacrawler-archetype-plugin-command (-)
3192: remote -> us.fatehi:schemacrawler-archetype-plugin-dbconnector (-)
3193: remote -> us.fatehi:schemacrawler-archetype-plugin-lint (-)
3194: remote -> ws.osiris:osiris-archetype (Maven Archetype for Osiris)
3195: remote -> xyz.luan.generator:xyz-gae-generator (-)
3196: remote -> xyz.luan.generator:xyz-generator (-)
3197: remote -> za.co.absa.hyperdrive:component-archetype (-)
3198: remote -> za.co.absa.hyperdrive:component-archetype_2.11 (-)
3199: remote -> za.co.absa.hyperdrive:component-archetype_2.12 (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1994:

さらにquickstartのどのバージョンを選択するかを聞かれます。デフォルトの最新8が選択されているのでそのままEnterで進めます。

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8:

groupIdと呼ばれる開発者の識別IDのようなものを聞かれます。hogeと入力しておきます。

Define value for property 'groupId':

artifactIdを聞かれます。mvn-sampleとしておきます。

Define value for property 'artifactId':

バージョンを聞かれますので、そのままEnterで進めます。

Define value for property 'version' 1.0-SNAPSHOT: :

パッケージ名を聞かれます。groupIdが指定されているので、そのままEnterで進めます。

Define value for property 'package' hoge: :

最終確認を尋ねられますので問題なければそのままEnterで進めます。

Confirm properties configuration:
groupId: hoge
artifactId: mvn-sample
version: 1.0-SNAPSHOT
package: hoge

以下のように出力されて、プロジェクトの作成が完了しました。

[INFO] Parameter: groupId, Value: hoge
[INFO] Parameter: artifactId, Value: mvn-sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: hoge
[INFO] Parameter: packageInPathFormat, Value: hoge
[INFO] Parameter: package, Value: hoge
[INFO] Parameter: groupId, Value: hoge
[INFO] Parameter: artifactId, Value: mvn-sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Project created from Archetype in dir: /xxx/maven_practice/mvn-sample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11:24 min
[INFO] Finished at: 2022-12-25T15:08:13+09:00
[INFO] ------------------------------------------------------------------------

フォルダ構造を確認します。

% tree
.
└── mvn-sample
    ├── pom.xml
    └── src
        ├── main
        │   └── java
        │       └── hoge
        │           └── App.java
        └── test
            └── java
                └── hoge
                    └── AppTest.java

App.javaを開いてみると、以下のような簡単なコードが既に記載されていることがわかります。

package hoge;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

同様にAppTest.javaを開いてみると、以下のようなテストコードが書かれています。必ずtrueを返します。

package hoge;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }
}
よかったらシェアしてね!
目次