# 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 ```