Mavenを使ってみる

# 概要
Mavenってなに?という状態なので、調べて使ってみることに。
個人的メモ。

# Mavenとは?
下記を読んでみました。
http://d.hatena.ne.jp/keyword/Maven
https://kengotoda.gitbooks.io/what-is-maven/content/preface.html

>ビルドツールApache Antのようにbuild.xmlを自分で手間をかけて記述することなくプロジェクトのビルドやデプロイ、テストレポートなどの生成を容易にすることができる。

* PHPでいうところのPEARみたいなもの。
* 現在はMaven3まであるようで、最新版はMaven3.3.9らしい。

Javaも使ったことないのでJavaの勉強としても、Maven使って動かしてみることに。


# 前提条件
* centos7
* java8

# 導入手順

```
$ wget http://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

$ tar xvzf apache-maven-3.3.9-bin.tar.gz

$ mv apache-maven-3.3.9 /usr/local/

$ ln -s /usr/local/apache-maven-3.3.9/bin/mvn /usr/local/bin/mvn

$ mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /usr/local/apache-maven-3.3.9
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "4.4.27-boot2docker", arch: "amd64", family: "unix"
```

# プロジェクト作成

```
mvn archetype:generate -DinteractiveMode=false \
                         -DarchetypeGroupId=pl.org.miki \
                         -DarchetypeArtifactId=java8-quickstart-archetype \
                         -DgroupId=hello.world \
                         -DartifactId=helloworld \
                         -Dversion=1.0-SNAPSHOT \
                         -Dpackage=hello.world \
                         -Dpackaging=jar
$ tree helloworld/
helloworld/
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- hello
    |           `-- world
    `-- test
        `-- java
            `-- hello
                `-- world

9 directories, 1 file
```

# 生成されたpom.xml
> pom.xml はプロジェクトに関する情報を持つ重要なファイルです。 例えば、プロジェクトのビルドに関する情報や、依存するライブラリの情報、プラグインの設定などが含まれます。

参考
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/2-2/#maven-2-4

```
<?xml version="1.0" encoding="UTF-8"?>
<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>hello.world</groupId>
	<artifactId>helloworld</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>jar</packaging>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
```


# ソースを配置
```
$ pwd
/root/helloworld/src/main/java/hello/world

$ cat HelloWorld.java
package hello.world;

public class HelloWorld {
    public static void main(String[] args){
        System.out.println("Hello, world.");
    }
}
```
# ソースコードのビルド
ビルドするとtargetディレクトリが作成される

```
$ cd helloworld
$ mvn compile
$ tree helloworld/
helloworld/
|-- pom.xml
|-- src
|   |-- main
|   |   `-- java
|   |       `-- hello
|   |           `-- world
|   |               `-- HelloWorld.java
|   `-- test
|       `-- java
|           `-- hello
|               `-- world
`-- target
    |-- classes
    |   `-- hello
    |       `-- world
    |           `-- HelloWorld.class
    |-- generated-sources
    |   `-- annotations
    `-- maven-status
        `-- maven-compiler-plugin
            `-- compile
                `-- default-compile
                    |-- createdFiles.lst
                    `-- inputFiles.lst

19 directories, 5 files
```
# ソースの実行

```
$ java hello.world.HelloWorld
```


# 嵌ったこと1
Javaのソース内にpackage ~~~と書く場合、
Mavenのプロジェクト生成時の実行時に指定するpackageと合わせる必要があった。

# 嵌ったこと2
生成したソースを実行する際に上手くいきませんでした。
結果としてはjavaの実行場所がよくありませんでした。

今回の場合packageとしてhello.worldとしていた。
実行する場所としては下記でした。

```
$ pwd
/root/helloworld/target/classes

$ java hello.world.HelloWorld
Hello, world.
```

# 嵌ったこと3

今回の例であげているソースではありませんが
ビルドするソース内でtry-with-resourcesを利用していたことで、
上手く、ビルドできない問題が発生することがありました。
try-with-resourcesはJava7から実装されていたが、現在入れているのはJava8なので
何故、上手く行かないのか、嵌っていた。。。

で、解決策としては、プロジェクトの作成時に明示的にJava8でビルドするよっていうことを伝えてあげないといけなかった。

下記を参考にさせていただきました。
http://qiita.com/mkamotsu/items/98c6d721a87a74f2b36f
http://d.hatena.ne.jp/Kazuhira/20151010/1444479555