【解説編】Apache Mavenとは...
Mavenとは
MavenはProject Object Model (POM) という考え方に基づき、プロジェクトのビルド、テスト、ドキュメンテーション、成果物の配備など、プロジェクトのライフサイクル全体を管理できるツールです。プロジェクトに関する色々な情報をPOMに集約し、POMの情報に基づきプロジェクト全体を管理します。
・Mavenを使用すると、プロジェクトのライフサイクルに含まれるコンパイルやテストなどの各作業をコマンド一つで行うことができます。
・Mavenは必要なプラグインやライブラリをリモートリポジトリからダウンロードし、それをローカルリポジトリに保存します。
・各プロジェクトはローカルリポジトリに保存されているライブラリを参照します。
・ローカル環境にある全てのプロジェクトの間でライブラリを共有することができます。
POMについて
プロジェクトに関する情報を持つファイルです。まずはpomの記述方式を理解しましょう。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
//<project>タグがルートノードとして用意されており、POMのバージョンが記載されています。
<project
xmlns="http://maven.apache.org/POM/4.0.0"
//次に、mxlのスキーマの指定があります。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//MavenのPOM4.0のXMLスキーマの指定です。これによりMaven関係のタグが使用できるようになる。
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>com.nuko.springboot</groupId>
<artifactId>MyBootApp</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MyBootApp</name>
<!-- FIXME change it to the projects 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>
・・・続く
タグの説明
pom.xmlの大きな特徴がdependenciesタグでのライブラリの管理です。dependenciesタグとは依存性に関する記述を行うタグで、このプログラムがどのようなプログラムに依存しているかを記述します。
その内容を記述することで依存ライブラリを自動的にダウンロードしてインストールすることが可能になります。
dependencyタグには4つの項目が用意されています。それぞれ次のような役割を果たします。
<dependencies>
<dependency>
<groupId>junit</groupId> //インストールしたいライブラリのグループIDを指定
<artifactId>junit</artifactId>//インストールしたいライブラリのアーティファクトIDを指定
<version>4.13.1</version> //使用するプログラムのバージョンを指定。省略すると最新バージョンを指定します。
<scope>test</scope> //このライブラリが適用される範囲を指定します。これには「compile」、「test」、「system」、「runtime」、「provided」のいずれかを指定します。
//主にテスト時にのみ使うなど通常と異なる用途の場合に置くと考えてください。
</dependency>
</dependencies>
プロジェクト作成
mavenプロジェクトを作成する場所へ遷移してコマンドプロンプトでmavenプロジェクトの作成コマンドを実行してください。
mvn archetype:generate
(Mavenセットアップ手順は後日記事をUpします。こんなもんなんだ程度で飛ばしてください。)
①まずアーキタイプのバージョンの入力を求められる。デフォルトでは最新のバージョンになるのでスキップ。
②グループIDなのでJavaのパッケージ名を記入する。com.nuko.springbootなどでよい。
③アーティファクトID、いわばアプリケーション名を記入する。MyBootAppなどでよい。
④プロジェクトをJARやWARファイルに変換する際、デフォルトでつけられるバージョンのテキストを指定する。無視してEnterでOK。
⑤プロジェクトのプログラムにデフォルトで設定されるパッケージが聞かれる。無視してEnterでOK。
※BUILD SUCCESSが表示されたら完了。
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:48 min
[INFO] Finished at: 2020-10-25T21:45:33+09:00
[INFO] ------------------------------------------------------------------------
ディレクトリ構成
MyBootApp/
├── pom.xml
└── src
├── main
├── java
├── com
├── nuko
├── springboot
├── App.java
└── test
├── java
├── com
├── nuko
├── springboot
└── AppTest.java
コンパイル
プロジェクトのカレントディレクトリへ遷移し下記コマンドで配下のソースコードをすべてコンパイルする。src/main/java/配下等のソースファイルのコンパイルが行われます。コンパイルにより作成されたクラスファイルはtarget/classesディレクトリが作成され、出力されます。
mvn compile
ディレクトリ構成
MyBootApp/
├── pom.xml
└── src
└── target
├── classes
├── com
├── nuko
├── springboot
├── App.java
├── test-classes
├── com
├── nuko
├── springboot
├── AppTest.java
├── maven-status
classes(test-classes)フォルダには、コンパイルされたJavaクラスファイルが保存される。通常のjavacコマンドと同様に、パッケージごとにフォルダ整理された状態でクラスファイルが保存される。
maven-statusフォルダはcompileで利用されるcompilerプラグインによって生成されるファイルが保存される。
テスト
mvn test
デフォルトでは、以下のパターンにマッチするファイルがテストとして実行されます。
**/Test*.java
**/*Test.java
**/*TestCase.java
また、以下のファイルはデフォルトで除外されます
**/Abstract*Test.java
**/Abstract*TestCase.java
**/*$*
パッケージング
下記コマンドでプログラムをコンパイルしユニットテストを実行した後、Jarファイルにパッケージ化する処理がすべて自動で行われる。
成功するとtargetディレクトリに**.jarのようなファイルが作成されます。
作成されるファイルの名前は、pom.xmlに記述されている artifactIdとversionから決定されます。
拡張子は,pom.xmlに記述されているpackagingから決定されます。
mvn package
インストール
JARをローカルリポジトリにインストールする。
mvn install
クリーンアップ
生成されたtargetフォルダ配下のファイルをすべて削除することができます。プログラムを修正してpackage、installの先に実行するのが一般的です。Jarに固める前などに行いましょう。
mvn clean
デプロイ
パッケージをリモートリポジトリに登録するコマンドです。
deployを実行すれば、その前のフェーズが全部実行されます。
mvn deploy
プログラム起動
MavenにはJavaを実行するためのゴールが用意されていないので、プラグイン「exec-java-plugin」を利用して起動します。その際buildタグを使用する。
・buildタグにはプラグインに関する情報が記述される。
・pluginタグにはプラグインに関する情報をまとめて記述する。これらのタグは一つしか使用できない。
・buildタグに記述されるプラグインは、「ビルドプラグイン」と呼ばれる。
configurationタグを使いメインクラスの情報を渡しています。これにより設定したメインクラスが呼ばれるようになっている。
mvn exec:java
pom.xml
<!-- プラグインの設定 -->
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-java-plugin</artifactId>
<version>1.5.0</version>
<configuration>
<!-- ここでメインクラスを設定する -->
<mainClass>${mainClass}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
リポジトリとは
リポジトリとは、各種ライブラリ等のソフトウエアが登録される一種の保管場所です。
Mavenでは、pom.xmlに<dependency>タグを用意することでライブラリを自動的にロードできるようになっています。
リポジトリは、アドレスを設定することでMavenに追加できますが、何も設定しなくともデフォルトで利用できるリポジトリがありそれを「セントラルリポジトリ」と呼びます。
セントラルリポジトリとは
Maven開発元のApache Software Foundationが運営するサイトの事。pomにアドレスを指定せずにデフォルトで利用できるリポジトリです。
サイト自体は、閲覧がしずらく必要なライブラリが何処にあるか知っていないと探し出すことは難しいです。
サーチエンジンサイト
セントラルリポジトリに登録されているプログラムを検索するサーチエンジンサイトが用意されています。
Junitをセントラルリポジトリから検索しています。
検索結果には、Group ID:Artifact ID:Latest Versionが記載されています。画面左下にはJunitライブラリのPomに記載されている内容を直接確認できるのでライブラリの依存性を確認することができます。
リポジトリ登録プログラム情報の確認
Junitを例にセントラルリポジトリの情報を確認してみましょう。こちらのページも参照ください。参照先:Junit
・Project Infomation
画面左上に「Group ID」、「Artifact ID」、「Latest Version」の順でプロジェクト情報が記述されていますが、Project Infomationと呼びます。
・Dependency Information
画面右にはビルドツールごとに依存性に関する情報が掲載されています。pom.xmlに記述すべき内容が表示されており<dependency>タグにそのままこの内容をコピーすればよいのです。記述する内容が記載されている。
・ProjectObjectModel(POM)
ライブラリに用意されているpom.xmlの内容です。これを確認することでどんなライブラリが必要なのかが分かります。
セントラルリポジトリはMaven以外にも使用されている。
Dependency Informationのところにあるように「Apache Maven」だけでなく他のビルドツールでの記述方法も記載されています。
リポジトリの考え方は、多くのビルドツールでも採用されておりJavaの開発で必要なライブラリはビルドツールが何であれ変わらないので、リポジトリに用意しておくべきプログラムは大体同じ。ということもあり合同でセントラルリポジトリが運営されています。
セントラルリポジトリとそのエンジンサイトの使用方法を知っておくことは、Mavenに限らずどんなビルドツールを利用する場合でも役立つでしょう。
リポジトリの種類、リモート/ローカルリポジトリ
すべてのプログラムが同じセントラルリポジトリに用意されているわけではありません。著名でないライブラリや自分で作成したライブラリを使用する際、セントラルリポジトリで公開されていないものもあります。
リモートリポジトリからダウンロードしてきたアーティファクトやメタ情報(pom.xml とか)は、 Maven を実行したマシンのローカルにキャッシュされます。
このキャッシュ先のことを、ローカルリポジトリと呼ぶ。
※毎回ビルドのたびにリモートリポジトリにアクセスしていると、時間がかかるしネットワークが使用できない環境ではビルドもできなくなってしまう
Maven はまず先にローカルリポジトリを検索するようになっている。
ローカルリポジトリの場所は、デフォルトで%USERPROFILE%\.m2\repository になります。※Linux 系の OS なら $HOME/.m2/repository
リモートリポジトリ
ネットワーク経由でサーバへアクセスし利用できる更改されたリポジトリの事。セントラルリポジトリが代表例。
ローカルリポジトリ
ローカル環境にあるリポジトリです。Mavenは、ローカルボリューム内にリポジトリを作成します。
ここにインストールしたライブラリはリモートリポジトリと同様にMavenから扱うことができる。
リモートリポジトリの利用
セントラルリポジトリ以外のリポジトリを利用する方法について説明します。リモートリポジトリは、pom.xmlに<repositories>というタグの中にリポジトリの情報を記述することで利用できるようになります。
「AspectJ」というライブラリを使用してみましょう。
これはAOPを実現する為の機能を提供するライブラリです。pom.xmlの<dependency>タグを編集します。pom.xmlに下記の依存性を追記してください。
pom.xml
<dependencies>
・・・
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.6</version>
</dependency>
<dependencies>
さらに下記の記載を追加しましょう。AspectJライブラリが保管されているリポジトリを追加することでセントラルリポジトリ以外に登録されているライブラリも使用できるようになります。
pom.xml
※Spring.ioが提供するリポジトリを追加して再度mvn packageを実行する。
<repositories>
<repository>
<id>spring-repo</id>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
最後に
Mavenの説明は以上です。次はMavenのインストールについて記事を上げたいと思いますのでまた是非ご覧ください。最後までありがとうございました。