229 lines
5.7 KiB
Markdown
229 lines
5.7 KiB
Markdown
# 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
|
|
<project>
|
|
<!-- add -->
|
|
<build>
|
|
<plugins>
|
|
<plugin>
|
|
<groupId>org.codehaus.mojo</groupId>
|
|
<artifactId>exec-maven-plugin</artifactId>
|
|
<version>3.1.0</version>
|
|
<configuration>
|
|
<mainClass>com.example.App</mainClass>
|
|
</configuration>
|
|
</plugin>
|
|
</plugins>
|
|
</build>
|
|
<!-- /add -->
|
|
</project>
|
|
```
|
|
|
|
直接実行する場合は以下です
|
|
|
|
```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
|
|
<project>
|
|
<!-- add -->
|
|
<build>
|
|
<plugins>
|
|
<plugin>
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
<artifactId>maven-assembly-plugin</artifactId>
|
|
<version>3.6.0</version>
|
|
<configuration>
|
|
<archive>
|
|
<manifest>
|
|
<mainClass>com.example.App</mainClass>
|
|
</manifest>
|
|
</archive>
|
|
<descriptorRefs>
|
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
|
</descriptorRefs>
|
|
</configuration>
|
|
<executions>
|
|
<execution>
|
|
<phase>package</phase>
|
|
<goals>
|
|
<goal>single</goal>
|
|
</goals>
|
|
</execution>
|
|
</executions>
|
|
</plugin>
|
|
</plugins>
|
|
</build>
|
|
<!-- /add -->
|
|
</project>
|
|
```
|
|
|
|
コマンド
|
|
|
|
```sh
|
|
mvn clean package
|
|
java -jar target/hello-maven-1.0-SNAPSHOT-jar-with-dependencies.jar
|
|
``` |