今までビルドツールはGradleを使っていたのですが、
業務でMavenを使うことになり、全く使ったことがなかったので少し触ってみました。
Mavenとは
Project Object Model(POM)という考え方にもとづいてプロジェクトを管理する、ビルドツールです。
プロジェクトの情報やプラグインをpom.xmlで管理しています。
MavenのあとにGradleが出てきたので、GradleがMavenの良いとこ取りをしており、
MavenもGradleと同様にコマンドでテストやコンパイルをすることができます。
IntelliJ でJavaプロジェクトを作成
プロジェクトを新規作成します。
Mavenは archetype(アーキタイプ)という雛形を使ってプロジェクトを作成するようです。
今回はシンプルなJavaプロジェクト用アーキタイプのmaven-archetype-quickstart
を選択します。
IDは適当に入力します。
ここはデフォルトのまま次へ進みます。
IDを適当に入力します。
プロジェクト作成が完了するまで少し待ちます。
完了したら右上のリンクをクリックします。
pom.xmlにプロジェクトの情報が設定されています。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>maven1</groupId>
<artifactId>maven1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
src/main/java 配下にデフォルトでApp.java
が作成されているので、実行してみます。
右クリックしてRunを選択します。
src/test/java 配下にテストファイルAppTest.java
が作成されているので、実行してみます。
右クリックしてRunを選択します。
次はコマンドラインから実行してみます。
Mavenのインストール
brewでインストールします。
$ brew install maven
$ mvn -v
コンパイルします。
$ mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building maven1 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/maven1/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven1 ---
[INFO] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.830 s
[INFO] Finished at: 2018-03-04T18:17:53+09:00
[INFO] Final Memory: 8M/155M
[INFO] ------------------------------------------------------------------------
テストを実行します。
$ mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building maven1 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/maven1/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven1 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/maven1/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven1 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven1 ---
[INFO] Surefire report directory: /Users/maven1/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running maven1.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.284 s
[INFO] Finished at: 2018-03-04T18:15:27+09:00
[INFO] Final Memory: 10M/220M
[INFO] ------------------------------------------------------------------------
テストが失敗したときの出力結果です。
wikiを見るように促されています。
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running maven1.AppTest
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.009 sec <<< FAILURE!
testApp(maven1.AppTest) Time elapsed: 0.005 sec <<< FAILURE!
junit.framework.AssertionFailedError
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertTrue(Assert.java:27)
at maven1.AppTest.testApp(AppTest.java:36)
Results :
Failed tests: testApp(maven1.AppTest)
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.351 s
[INFO] Finished at: 2018-03-04T18:32:33+09:00
[INFO] Final Memory: 9M/155M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project maven1: There are test failures.
[ERROR]
[ERROR] Please refer to /Users/maven1/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
使ってみた所感
ビルドファイルについて、Gradleはgroovyで書かれていたので簡潔に書くことができましたが、
MavenはXMLファイルなので記述量も増えますし、見づらく感じました。
ディレクトリの構造やコマンドなどはMavenもGradleもほぼ同じだったので、理解はしやすかったです。
エラーについてもGradleは行単位でエラーを出してくれるのに対し、
Mavenはプラグイン内でもみ消されることが多かったり、wikiを見るように促されたりするようなので、
Gradleよりも見づらく感じました。
GradleのほうがMavenよりも後に出てきて良いとこ取りをしていることもあり、
これから新しくプロジェクトを作成する際は、
Gradleを使ったほうが良いのではないかと思いました。
とりあえず、Mavenの使い方が理解できたので良かったです。