WindowsでのJava開発環境構築ガイド：OpenJDKとMavenの設定

# Javaの環境構築

### 実行環境
- Windows 11 Home
- OpenJDK 17 GA
- IntelliJ IDEA Community Edition 2024.3.1
- Maven 3.9.9
- Maven Wrapper 0.7.7

### JDK（Java Development Kit）
Javaプログラムの作成やコンパイルに必要なツール（標準ライブラリなど）

#### JDKインストール時の注意点

* あとでJakarta EE をインストールしたい場合、安定版（LTS）のSE（OpenJDK）をインストールするのが推奨される。最新のSEにはまだEEが対応していない可能性が高いため。（EEのインストール時にも、最新のSEを選択することができない）

* 最新以外のバージョンのインストールはアーカイブページ（Archived OpenJDK GA※ Releases）が別にある。（https://jdk.java.net/archive/）

※GAは ”General Availabilityの略で、セキュリティパッチなどがあてられているため、比較的安定して使用できる。

#### インストール手順
1. OpenJDKの公式サイト（[https://openjdk.org](https://openjdk.org)）からzipファイルをダウンロード。

※無料のGPL（General Public Licence）と商業利用ライセンス（有償）の2種類が公式サイトで配布されている。※最新以外のバージョン（JDK17など）は、本番（production-ready）対応版のGPLが存在する。これはOpenJDK コミュニティが配布しており、無料で使用できる。（ただし、最新ではなく脆弱性が含まれる可能性もあるため、過去のアーカイブとして配布されている。）<br>
2. 管理者権限でエクスプローラーを開き（スタートメニューで`cmd`を検索してコマンドプロンプトを管理者として実行し、`start explorer.exe`というコマンドを実行する）、展開したフォルダを`C:\Program Files`に貼り付ける。<br>
3. ファイル名を指定して実行し（[Windows]＋[R]キー）、`sysdm.cpl` と入力。「システムのプロパティ」から詳細設定タブを開き、「環境変数」のボタンをクリック。システム環境変数JAVA_HOME※に、JDKがインストールされているパスを設定する。システムのPath※に`C:\Program Files\<OpenJDKのフォルダ名>\bin`ディレクトリのパスを追加する。<br>
4. コマンドプロンプトを新たに開き、`java -version` を実行する。インストールしたOpenJDKのバージョンが表示されれば、インストールが完了。<br>
5. IDE（統合開発環境）にJAVA_HOMEを設定し、使用するJDKを指定する。テストプロジェクトをビルドしたりコンパイルができるかテストする。ビルドやコンパイルが正常にできれば、IDEで指定したJDKでビルドやコンパイルができていることが確認できる。

#### 備考
- **JAVA_HOME**を参照することで、MavenやGradleなどのビルドツールからもJavaコンパイルなどのツールを正しく認識できる。
- **JAVA_HOMEの設定値の例**：`C:\Program Files\Java\jdk-17`
- **Pathの設定値の例**：%JAVA_HOME%\bin

### JRE（Java Runtime Environment）
Javaを実行するために必要な環境。JVM（Java Virtual Machine）もこれに含まれる。

#### インストール手順
OpenJDKに同梱される。

### Maven
Javaプロジェクトのビルドツール。

#### Mavenインストール時の注意点
- **注意点1**：Mavenをアップデートすると、バージョンが古く、新しいMavenに対応していないライブラリやプラグイン※との互換性がなくなったり、新しいMavenになったことによって、ビルド対象のライブラリやツールの依存関係が変更されたり、設定ファイル（依存関係などを記述するpom.xml）の形式や内容が変更された場合、既存の設定ファイルの記述では正しく動作しなくなる可能性がある。アップデートを行う前に、使用しているライブラリやプラグイン、あるいは現在定義されている依存関係の変更の有無などを確認する必要がある。アップデートを行う前に、Mavenのリリースノートや互換性情報を確認し、必要に応じてテスト環境で事前にテストする必要がある。 
    - ※Mavenのプラグインは、ビルドやドキュメンテーションなどのタスクを自動化することができる。
- **注意点2**：MavenはzipファイルをApacheのサイトからダウンロードし、それを手動で開発マシンのフォルダに展開して使用する。zipフォルダ名に含まれているMavenのバージョン番号を展開するフォルダ名にも含めてしまうと、MavenのバージョンをアップデートするごとにMAVEN_HOMEやPATHの環境変数の値を変更しないといけない。

#### インストール手順
1. Apache Maven の公式サイト（[https://maven.apache.org](https://maven.apache.org)）からMavenのzipファイル（バイナリアーカイブ※）をダウンロード。
2. 
    - システム環境変数Pathに`C:\Program Files\<Mavenのフォルダ名>\bin`ディレクトリを設定。
    - コマンドプロンプトを開き、`mvn -version`を実行する。Mavenのバージョンが表示されたらインストールが完了。
3. （必須ではない。Maven WrapperがMavenと互換性がなく、Maven Wrapperをアップデートする場合は行う）下記に詳述するmaven-wrapperをダウンロードする：
    - 公式サイト（[https://maven.apache.org](https://maven.apache.org)）＞”Download”リンクを選択＞Maven最新リリースの下にある以下のリンクをクリック。
    - `other: All current release sources (plugins, shared libraries,...) available at …`
    - 通常は、pom.xmlでMaven Central Repositoryからmaven-wrapperをインストールできる。その場合はこの手順は不要。最新（公開前）の maven-wrapperを使ってMavenプロジェクトをテストする場合は、上記の手順でダウンロードするここができる。
4. （Mavenをアップデートする場合）`maven-wrapper.properties`を編集し、Mavenの最新バージョンを使用するように設定。（`maven-wrapper.properties`の内容は、下記に詳述する。）

#### 備考
- **バイナリアーカイブ**：コンパイル済みの実行可能ファイルが含まれている。これには、Mavenを実行するために必要なすべてのファイル（JARファイルやスクリプトなど）が含まれる。

### テスト環境だけでMavenの新しいバージョンをアップデートする方法
Mavenのアップデートは、ちょっと面倒なことになる場合があります。特に、プラグインやライブラリのバージョンとの互換性を気にしながら慎重に進めたいですよね。そこで、まずテスト環境で新しいバージョンのMavenを試してみることがよくあります。このセクションでは、テスト環境でMavenの新しいバージョンをうまく使うための方法を簡単に紹介します。
#### maven-wrapperを使用する方法
- **maven-wrapperとは？**：プロジェクトごとにMavenバージョンを管理するツール（プラグイン）

##### Mavenのバージョンの指定方法
1. プロジェクトディレクトリに移動する。
    ```bash
    cd /path/to/your/project
    ```
2. bashで（Windowsコマンドプロンプトでも可能）以下のコマンドを実行する。
    ```bash
    mvn -N io.takari:maven:wrapper -Dmaven=3.x.x
    ```
    - 3.x.xの部分は、自分がインストールしたMavenのバージョン。
    - `Maven Wrapper version 0.5.6 has been successfully set up for your project.` や`BUILD SUCCESS` と表示されればOK。
    - IDEAで実行すると、`ライフサイクルのフェーズを正しく設定してください` のような警告が出ることがある。その場合、以下を実行する。
    ```bash
    mvn io.takari:maven:wrapper:wrapper -Dmaven=3.9.9
    ```
    - アーティファクトのバージョンの部分を`wrapper` にすると、最新のプラグインをリポジトリから取得してくる。

##### Maven Wrapperのインストールと設定、実行
1. プロジェクトの`pom.xml`にMaven Wrapperをローカルリポジトリ※としてプラグインの設定を行う：
    - ※別のプロジェクトから使用する場合、ローカルリポジトリという。
    - `/path/to/your/project`に`pom.xml`を作成。
    - 以下のコードを`pom.xml`に記述し、`mvn clean install -U`を実行（ローカルリポジトリのキャッシュをクリアして、再度依存関係を取得 ）。

    ```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>org.example</groupId>
        <artifactId>myproject</artifactId>
        <version>1.0-SNAPSHOT</version>

        <properties>
            <maven.compiler.source>23</maven.compiler.source>
        <maven.compiler.target>23</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>3.0.0-M3</version>
                <executions>
                    <execution>
                        <id>enforce-maven-version</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <version>3.9.9</version>
                                </requireMavenVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>io.takari</groupId>
                <artifactId>maven</artifactId>
                <version>0.7.7</version>
                <executions>
                    <execution>
                        <id>wrapper</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>wrapper</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories></project>

2. `mvnw.cmd`ファイルがプロジェクトディレクトリに生成される。その`mvnw.cmd`を使用して、以下のようにコマンドプロンプトで実行する。(この`.cmd`ファイルはMaven Wrapperを実行するバッチファイル）
    ```bash
    .\mvnw.cmd clean install
    ```
    - `BUILD SUCCESS` と表示されればOK。

#### pom.xmlの説明

- **plugin.artifactId.maven-enforcer-plugin**：プロジェクトに必要な最小要件のMavenバージョンをplugin.executions.execution.configurationの rules要素 と requireMavenVersion 要素で指定する（この場合は3.9.9）
- **plugin.artifactId.maven**：Maven Wrapperのアーティファクト。versionでMaven Wrapperのバージョンを指定する。この場合は0.7.7を指定している。（Maven Central Repositoryにリリースされているバージョンを使用すること。）
- **plugin.executions.execution.goals.goal**：Maven Wrapperの目標（ゴール）。そのプラグインが実行する特定のタスクをgoalに設定する。mvnコマンドでプロジェクトのMavenのバージョンを設定するときも、このgoalに設定した値（この場合はwrapper）を使う。
- **project.repositories.repository**：プラグインをどこから取得するかを設定する。ここでは、Maven Central Repositoryから取得するので、url要素にそのURLを指定する。

#### mvnコマンドの説明

- mvnコマンドはMavenのコマンドラインツール。ビルド、テスト、デプロイ、依存関係の管理などを実行できる。
- `mvn -N`は、プロジェクトのルートPOM（Project Object Model）ファイルに対してのみコマンドを実行し、サブモジュールには適用しない（NはNon-recursiveの略）。大規模なプロジェクトでも特定の処理を迅速に実行できる。
- `io.takari`は、`Takari Maven Wrapper` というMavenプラグインを提供しているライブラリのグループID。コマンドの引数の`maven` はアーティファクトID。アーティファクトとは「成果物」の意味。Mavenプロジェクトにおいて、特定のアーティファクト（＝ライブラリやプラグイン）を一意に識別するのがアーティファクトID。グループID、バージョンと併せて使用する。
- `wrapper`は、目標（Goal）。プラグインの場合は、そのプラグインが実行する特定のタスクを表す。
- `-Dmaven`オプションには、プロジェクトのビルドに使用するMavenのバージョンを指定する。
- `mvnw.cmd`の`clean`は、ビルドディレクトリを削除し、次のビルドをクリーンな状態から実行する。`install`は、ビルドしたアーティファクト（JARなど）をローカルリポジトリにインストールする。cleanもinstallもMavenの目標（goal）の一つ。ローカルリポジトリはほかのプロジェクトから依存関係として、このプロジェクトを使用することができる。

#### 他の方法（個人的に非推奨）
ほかにも、環境変数をbash（Windowsコマンドプロンプトでも可能）でプロジェクトフォルダごとに別の値を書き込む方法があるが、Linux系での書き方とまるっきり違うので、混乱がある。また、Linuxでいうところの.bashrcとか.bash-profileがWindowsで何に当たるか、分からない。

##### 上記の1.の方法（Maven wrapper）の問題点

できればやりたくないが、必要な場合もある。それは、上記の1のMaven Wrapperを使う方法で、このツールの最新バージョンじたいがまだテストしたいMavenのバージョンに対応していない場合がある（※）。この場合、Maven Wrapperを使ってMavenのバージョンをプロジェクトごとに指定することができない。その場合に、環境変数を使用してプロジェクトルートにバッチファイルを作成し、そのプロジェクトで使用したいMavenのバージョンを指定する。

- ※最新リリースのMaven（本稿執筆の2024年12月19日時点で3.9.9）に互換性がある（と推測される）maven-wrapperは以下のURLからダウンロードできる。Mavenの最新リリースのダウンロードサイトにリンクがある。
[https://dlcdn.apache.org/maven/](https://dlcdn.apache.org/maven/)

ただし、このURLにあるmaven-wrapperがまだMaven Central Repositoryに存在しない（公式リリースされていない）場合、更新しようとするとエラーになる。

##### 環境変数でテストプロジェクトにMavenのバージョンを指定する方法

1. テストプロジェクトのディレクトリにテストしたいMavenのバージョンをインストールする。
2. テストプロジェクトのルートディレクトリに以下のバッチファイル（.bat）を作成する。

    ```batch
    @echo off
    set MAVEN_HOME=C:\path\to\your\specific\maven\version
    set PATH=%MAVEN_HOME%\bin;%PATH%
    mvn clean install
    ```

3. 作成した.batファイルをダブルクリックして実行する。

##### 上記の1.の方法（Maven wrapper）の問題に対処する方法

1. まず、Maven Wrapperを最新のものにアップデートする：
    - `pom.xml`の<version>を最新のバージョンに指定する。
2. 最新のMavenのバージョンを`maven-wrapper.properties`で指定する。
3. Mavenのバージョンを更新する（例えば、4.x.xのバージョンに更新したい場合、以下のコマンドを実行）：

    ```bash
    mvn -N io.takari:maven:wrapper -Dmaven=4.x.x
    ```

例）
`maven-wrapper.properties`

    ```properties
    distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
    ```

#### propertiesファイルの説明
distributionUrlで指定したURLがMavenのバージョンになる。このURLのバージョン番号を特定のMavenバージョンに設定できる。

#### Mavenのバージョンを確認

1. Windowsの設定で、システム環境変数のPathにMavenのインストールディレクトリを追加する。（例えば、C:\path\to\your\maven\bin）
2. コマンドプロンプトで、正しいバージョンのMavenが設定されていることを確認する。

```bash
mvn -version
```

#### テストプロジェクトの作成とビルド
以下の手順で、簡単なテストプロジェクトを作成し、Mavenが正常に動作するか確認。

1. テストプロジェクトのディレクトリを作成。


2. Mavenプロジェクトの作成

3. プロジェクトディレクトリに移動してビルドを実行。

4. プロジェクトが正常にビルドされるか確認。うまくいけば、`BUILD SUCCESS`というメッセージが表示される。


```cmd
mkdir my-test-project
cd my-test-project
```

```cmd
mvn archetype:generate -DgroupId=com.example -DartifactId=my-test-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
```

```cmd
cd my-test-project
mvn clean install
```