# Mavenとは
Maven(メイヴン)は、Javaプロジェクトのビルド・依存管理・実行を自動化するツールです。
* Node.js の npm
* Python の pip + venv
## Install
### Windows
wingetでインストール
```sh
# JDK
winget install EclipseAdoptium.Temurin.21.JDK
# Maven
winget install Apache.Maven
# 確認
java -version
mvn -v
```
Chocolatey(管理者 PowerShell)でインストール
```powershell
choco install temurin21
choco install maven
```
永続的に設定(PowerShell管理者)
```powershell
# JDK のインストール先に応じてパスを調整
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-21"
setx MAVEN_HOME "C:\ProgramData\chocolatey\lib\maven\apache-maven-3.9.9"
setx PATH "%PATH%;%JAVA_HOME%\bin;%MAVEN_HOME%\bin"
```
プロジェクト作成・実行
```powershell
mvn archetype:generate -DgroupId=com.example -DartifactId=hello-maven `
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd hello-maven
mvn -q -DskipTests package
```
### Mac
Homebrewでインストール
```sh
brew install maven
# 確認
mvn -v
# 出力例
# Apache Maven 3.9.9
# Java version: 21.0.2
```
### Linux
Debian/Ubuntu
```sh
sudo apt update
sudo apt install -y temurin-21-jdk maven || sudo apt install -y openjdk-21-jdk maven
java -version
mvn -v
```
Fedora/RHEL/CentOS Stream
```sh
sudo dnf install -y java-21-openjdk java-21-openjdk-devel maven
```
### Dockerで実行する場合
公式イメージ: maven:3.9-eclipse-temurin-21
```sh
mkdir hello-maven && cd hello-maven
docker run --rm -it -v "$PWD":/app -w /app maven:3.9-eclipse-temurin-21 \
mvn -q archetype:generate -DgroupId=com.example -DartifactId=hello-maven \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd hello-maven
docker run --rm -it -v "$PWD":/app -w /app maven:3.9-eclipse-temurin-21 mvn -q -DskipTests package
```
# 生成物: target/*.jar はホスト側にも残る
## How To Setup
プロジェクト作成
```sh
mvn archetype:generate -DgroupId=com.example -DartifactId=hello-maven \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
```
以下の構築が作成されます
```txt
hello-maven/
├─ pom.xml
├─ src/
│ ├─ main/java/com/example/App.java
│ └─ test/java/com/example/AppTest.java
```
| オプション | 意味 |
| -------------------------------------------------- | --------------------------------------------------- |
| `archetype:generate` | |
| `-DgroupId=com.example` | グループID(Javaのパッケージ階層にも使われる) |
| `-DartifactId=hello-maven` | アーティファクトID(生成されるプロジェクト名) |
| `-DarchetypeArtifactId=maven-archetype-quickstart` | 使用するテンプレートの種類(標準の“最小構成”の1つ) |
| `-DinteractiveMode=false` | 対話モードをオフ(すべて自動) |
### 基本的なコマンド
* `mvn compile`
* ソースをコンパイル(`target/classes`へ)
* `mvn exec:java -Dexec.mainClass="com.example.App"`
* 実行(後述のplugin必要)
* `mvn test`
* テスト実行
* `mvn package`
* jarファイル作成(`target/hello-maven-1.0-SNAPSHOT.jar`)
* `mvn clean`:
* `target`ディレクトリ削除
直接`mvn exec:java`で動かす場合はpluginが必要です。
pom.xml
```xml
org.codehaus.mojo
exec-maven-plugin
3.1.0
com.example.App
```
直接実行する場合は以下です
```sh
java -cp target/classes com.example.App
```
* `-cp`: はクラスパス指定(classpath)
* `com.example.App`は完全修飾クラス名
* 拡張子`.class`は書かない
### パッケージ化する場合
1. Jarファイルを作成する
2. Jarから実行する
```sh
# java -cp target/xxx.jar com.example.App
java -cp target/hello-maven-1.0-SNAPSHOT.jar com.example.App
```
Javaは通常、.class(target/classes/)と他のライブラリ(.jar)を別々に管理しています。そのままだと実行時に依存jarが必要です。
```sh
java -cp target/classes:~/.m2/repository/gson-2.10.jar com.example.App
```
`fat jar`にまとめることにより全部ひとつのjarにパッキングできます。
maven-assembly-pluginが必要になります
```xml
org.apache.maven.plugins
maven-assembly-plugin
3.6.0
com.example.App
jar-with-dependencies
package
single
```
コマンド
```sh
mvn clean package
java -jar target/hello-maven-1.0-SNAPSHOT-jar-with-dependencies.jar
```