MavenでJavaプロジェクトを構築する

# 1.環境
Windows10
JDK8以降
開発環境：VSCode

# 2.プロジェクトのセットアップ
## 2.1.プロジェクトディレクトリの作成
以下のフォルダ構成を作成する
C:\
└ maven\
　└ demo\
　　└ src\
　　　└ main\
　　　　└ java\
　　　　　└ hello\

VSCodeにて`Ctrl+Shift+＠`を入力してターミナル(PowerShell)を起動する
以下のコマンドでフォルダを作成してVSCodeでフォルダを開く

```powershell
> mkdir C:\maven\demo\src\main\java\hello
> code -r C:\maven\demo
```

## 2.2.モジュールの作成
以下２つのモジュールを作成

```java:src/main/java/hello/HelloWorld.java
package hello;

public class HelloWorld {
  public static void main(String[] args) {
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}
```

```java:src/main/java/hello/Greeter.java
package hello;

public class Greeter {
  public String sayHello() {
    return "Hello world!";
  }
}
```

# 3.Mavenビルドのセットアップ
##3.1.Mavenのインストール
[Apache Maven Project](https://maven.apache.org/download.cgi)から最新版のBinary zip archiveをダウンロードして解凍する
（今回は「C:\maven」に"apache-maven-3.6.3-bin.zip"を解凍する）

解凍したMavenのbinフォルダをシステム環境変数Pathに追加する（VSCodeのターミナル(PowerShell)）

```powershell
> setx PATH "env:path;C:\maven\apache-maven-3.6.3\bin"
> $ENV:Path.Split(";")
～
C:\maven\apache-maven-3.6.3\bin
> mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: C:\maven\apache-maven-3.6.3\bin\..
Java version: 15.0.1, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-15.0.1
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
```

## 3.2.pom.xmlを作成
プロジェクトルート（今回の場合は「C:\maven\demo\直下」に`pom.xml`ファイルを作成する

```xml:pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>maven-test</artifactId>
    <packaging>jar</packaging>
    <version>0.1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>hello.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```
`<modelVersion>`：常に4.0.0
`<groupId>`：プロジェクトが所属するグループまたは組織。
`<artifactId>`：プロジェクトのライブラリアーティファクト（.jarや.warファイル）に付けられる名前。
`<version>`：ビルド中のプロジェクトのバージョン。実運用時にはデプロイのたびにアップすると良さそう。
`<packaging>`：パッケージ方法。


# 4.プロジェクトのビルド
## 4.1.Java コードをビルドする
以下のコマンドを実行してビルドする

```powershell
> cd c:\maven\demo
> mvn compile
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< org.springframework:maven-test >-------------------
[INFO] Building maven-test 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
　（中略）
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.567 s
[INFO] Finished at: 2020-11-24T11:03:47+09:00
[INFO] ------------------------------------------------------------------------

```

プロジェクトルートフォルダに「target」フォルダが作成され、classファイル等が作成されていることを確認する



以下ようなエラーが出た場合は、カレントディレクトリがプロジェクトルート（pom.xmlファイルが存在するフォルダ）になっていない可能性があるため、正しいフォルダに`cd`する。

```
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (C:\maven\demo). Please verify you invoked Maven from the correct directory. -> [Help 1]
```

## 4.2.配布用パッケージを作成する
以下のコマンドを実行して配布用パッケージファイル（今回は.jarファイル）を作成する

```powershell
> mvn package
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< org.springframework:maven-test >-------------------
[INFO] Building maven-test 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  18.008 s
[INFO] Finished at: 2020-11-24T11:26:26+09:00
[INFO] ------------------------------------------------------------------------
```

targetフォルダ直下に`maven-test-0.1.0.jar`ファイルが作成されていることを確認。
pom.xmlファイルで指定したartifactId＋versionがファイル名になっている。

## 4.3.実行確認
jarファイルを実行するとHello world!が表示される。

```powershell
> java -jar target\maven-test-0.1.0.jar
Hello world!
```

# 参考
[参考サイト](https://spring.pleiades.io/guides/gs/maven/)