IntelliJ で Maven + Java のプロジェクトを作成してみました

今までビルドツールはGradleを使っていたのですが、
業務でMavenを使うことになり、全く使ったことがなかったので少し触ってみました。






Mavenとは



Project Object Model(POM)という考え方にもとづいてプロジェクトを管理する、ビルドツールです。
プロジェクトの情報やプラグインをpom.xmlで管理しています。
MavenのあとにGradleが出てきたので、GradleがMavenの良いとこ取りをしており、
MavenもGradleと同様にコマンドでテストやコンパイルをすることができます。






IntelliJJavaプロジェクトを作成



プロジェクトを新規作成します。



f:id:mtomitomi:20180304190011p:plain





Mavenarchetypeアーキタイプ)という雛形を使ってプロジェクトを作成するようです。
今回はシンプルなJavaプロジェクト用アーキタイプmaven-archetype-quickstartを選択します。



f:id:mtomitomi:20180304190058p:plain





IDは適当に入力します。



f:id:mtomitomi:20180304190403p:plain





ここはデフォルトのまま次へ進みます。



f:id:mtomitomi:20180304190427p:plain





IDを適当に入力します。



f:id:mtomitomi:20180304190538p:plain





プロジェクト作成が完了するまで少し待ちます。

完了したら右上のリンクをクリックします。



f:id:mtomitomi:20180304190609p:plain





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を選択します。



f:id:mtomitomi:20180304190818p:plain



f:id:mtomitomi:20180304191047p:plain





src/test/java 配下にテストファイルAppTest.javaが作成されているので、実行してみます。
右クリックしてRunを選択します。



f:id:mtomitomi:20180304191106p:plain



f:id:mtomitomi:20180304191457p:plain





次はコマンドラインから実行してみます。






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で書かれていたので簡潔に書くことができましたが、
MavenXMLファイルなので記述量も増えますし、見づらく感じました。
ディレクトリの構造やコマンドなどはMavenもGradleもほぼ同じだったので、理解はしやすかったです。
エラーについてもGradleは行単位でエラーを出してくれるのに対し、
Mavenプラグイン内でもみ消されることが多かったり、wikiを見るように促されたりするようなので、
Gradleよりも見づらく感じました。
GradleのほうがMavenよりも後に出てきて良いとこ取りをしていることもあり、
これから新しくプロジェクトを作成する際は、
Gradleを使ったほうが良いのではないかと思いました。



とりあえず、Mavenの使い方が理解できたので良かったです。