ビルドタスクのJavaはそのままに、JenkinsのJavaバージョンを上げる方法

# 概要
JenkinsのJavaの対応バージョンがEOLを迎えるのでJavaのバージョンを上げたい。

![スクリーンショット 2025-04-11 154115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265229/d9e20957-1144-4432-a56e-9a6366395bbd.png)

しかし、同じサーバー上でビルドしているタスクは別途検証が必要なので一旦今までのバージョンで動かしたい。
そこで、JenkinsはJava 21にバージョンアップしつつ、ビルドタスクはJava 17のままにしたので、その方法を備忘録としてメモ。

# 環境
- Amazon Linux 2023
  - 2023.6.20250317
- Java 17
  - OpenJDK 17.0.14
- Jenkins
  - 2.492.3

# JenkinsでJava 17をJDKとして設定する

Jenkinsの管理 > Tools > インストール済みJDK > JDK追加

ここで現在使っているJava17を設定するので、サーバーに入ってJavaの実体を確認する。

```console
$ java -version
openjdk version "17.0.14" 2025-01-21 LTS
OpenJDK Runtime Environment Corretto-17.0.14.7.1 (build 17.0.14+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.14.7.1 (build 17.0.14+7-LTS, mixed mode, sharing)

$ which java
/usr/bin/java

$ ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 Apr 17  2024 /usr/bin/java -> /etc/alternatives/java

$ ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 52 Apr 17  2024 /etc/alternatives/java -> /usr/lib/jvm/java-17-amazon-corretto.x86_64/bin/java
```

![スクリーンショット 2025-04-11 161333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265229/542ad9f2-c2dd-4b3b-b19b-63619fc9b607.png)

`JAVA_HOME`にはディレクトリパスを入れる必要があるので`/bin/java`を除いて入力します。

# Java 21をインストールする

```console
$ dnf list --available "java-21*corretto*"
Last metadata expiration check: 0:01:15 ago on Fri Apr 11 16:25:12 2025.
Available Packages
java-21-amazon-corretto.x86_64                                        1:21.0.6+7-1.amzn2023.1                            amazonlinux
java-21-amazon-corretto-debugsymbols.x86_64                           1:21.0.6+7-1.amzn2023.1                            amazonlinux
java-21-amazon-corretto-devel.x86_64                                  1:21.0.6+7-1.amzn2023.1                            amazonlinux
java-21-amazon-corretto-headless.x86_64                               1:21.0.6+7-1.amzn2023.1                            amazonlinux
java-21-amazon-corretto-javadoc.x86_64                                1:21.0.6+7-1.amzn2023.1                            amazonlinux
java-21-amazon-corretto-jmods.x86_64

$ sudo dnf -y install java-21-amazon-corretto-devel
====================================================================================================================================
 Package                                      Architecture       Version                              Repository               Size
====================================================================================================================================
Installing:
 java-21-amazon-corretto-devel                x86_64             1:21.0.6+7-1.amzn2023.1              amazonlinux             150 k
Installing dependencies:
 java-21-amazon-corretto-headless             x86_64             1:21.0.6+7-1.amzn2023.1              amazonlinux              96 M

Transaction Summary
====================================================================================================================================
Install  2 Packages

Installed:
  java-21-amazon-corretto-devel-1:21.0.6+7-1.amzn2023.1.x86_64    java-21-amazon-corretto-headless-1:21.0.6+7-1.amzn2023.1.x86_64   

Complete!

$ java -version
openjdk version "21.0.6" 2025-01-21 LTS
OpenJDK Runtime Environment Corretto-21.0.6.7.1 (build 21.0.6+7-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.6.7.1 (build 21.0.6+7-LTS, mixed mode, sharing)
```

# Jenkinsを再起動する

```console
$ sudo systemctl restart jenkins
```

再起動後にJenkins上で冒頭のEOL表示が消えていればJava 21で動いているはずですが、念のため確認します。

```console
$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/java-17-amazon-corretto.x86_64/bin/java
*+ 2           /usr/lib/jvm/java-21-amazon-corretto.x86_64/bin/java

Enter to keep the current selection[+], or type selection number:

$ java -version
openjdk version "21.0.6" 2025-01-21 LTS
OpenJDK Runtime Environment Corretto-21.0.6.7.1 (build 21.0.6+7-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.6.7.1 (build 21.0.6+7-LTS, mixed mode, sharing)
```

切り替えなくてもデフォルトでインストールしたJava 21が有効になるようです。ちなみにJenkinsの設定でも確認できます。

Jenkinsの管理 > システム情報 > システムプロパティ

ここの`java.home`が`/usr/lib/jvm/java-21-amazon-corretto.x86_64`になっていればOKです。

# ビルドタスクごとに使用するJDKを設定する

どうやら`インストール済みJDK`が複数設定されていないとJDKを選択するプルダウンが出てこないようなので、Java 17と同様にJava 21もインストール済みJDKとして登録します。

そうするとタスクの設定でJDKを選択することができます。

![スクリーンショット 2025-04-11 164600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265229/2d617f1f-c584-4c63-bbc2-44db0feaba39.png)

デフォルトは`(System)`になっているので、これをJava17にすることで、
Jenkins本体 -> Java 21
ビルドタスク -> Java 17
と2種類のJavaバージョンを使い分けることができます。

## 追記：`(System)`ではダメでした

`(System)`=Jenkinsを動かしているJDK=Java21だと思っていたので、Java21でビルドしたいタスクを`(System)`で実行したところエラーでした。

```console
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project sample-project: Fatal error compiling: error: release version 21 not supported -> [Help 1]
```

明示的に`Java21`を選択したら正常に動きました。`(System)`だと何が使われるんでしょうか…ご存じの方がいたら教えてください。

# Mavenを使っている場合はmvnのバージョンも確認

```console
$ mvn --version
Apache Maven 3.8.4 (Red Hat 3.8.4-3.amzn2023.0.5)
Maven home: /usr/share/maven
Java version: 17.0.14, vendor: Amazon.com Inc., runtime: /usr/lib/jvm/java-17-amazon-corretto.x86_64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "6.1.130-139.222.amzn2023.x86_64", arch: "amd64", family: "unix"
```

どうやら`alternatives`でJava 21を指定していてもダメなようなので、`JAVA_HOME`にJava 21を設定してあげます。

```shell
$ sudo vi /etc/profile.d/java.sh

export JAVA_HOME=/usr/lib/jvm/java-21-amazon-corretto.x86_64
export PATH=$JAVA_HOME/bin:$PATH
```

※`mvn`コマンドを実行するのは`jenkins`ユーザー(=`nologin`ユーザー)のため`.bash_profile`がないので`/etc/profile`内で読み込まれるように`/etc/profile.d/java.sh`を作りました。

```console
$ source /etc/profile
$ mvn --version
Apache Maven 3.8.4 (Red Hat 3.8.4-3.amzn2023.0.5)
Maven home: /usr/share/maven
Java version: 21.0.6, vendor: Amazon.com Inc., runtime: /usr/lib/jvm/java-21-amazon-corretto.x86_64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "6.1.130-139.222.amzn2023.x86_64", arch: "amd64", family: "unix"
```

ビルドタスクごとにJavaのバージョンを設定できれば本番環境は旧バージョン、テスト環境では検証したい新バージョンで動かすことも可能なのでぜひお試しください。

# 参考
- [Linuxの環境変数の設定ファイルの読み込まれる順番](https://qiita.com/yasushi-jp/items/34522beae408faf269aa)