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 );
}
}