Java JDK を Ubuntu にインストールして Hello World する

# Java JDK を Ubuntu にインストールして Hello World する

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 に Java JDK をインストールする手順と、Hello World を出力する方法を紹介します。
![java_on_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/160c38d9-490d-015e-f508-6368cafddee4.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

+ Windows 11 の WSL Ubuntu 24.04 に Java JDK をインストールして、Java プログラムをビルド、実行するシンプルな開発環境を構築します。

## 技術トピック

### Java JDK とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [Java JDK](https://openjdk.org/)

:::note info
Java JDK とは、Java プログラミング言語で開発されたアプリケーションを作成するためのソフトウェアパッケージです。JDK には、Java 言語で書かれたコードをコンパイルして実行可能なバイナリファイルを生成するための Java コンパイラや、Java アプリケーションを実行するための Java ランタイムが含まれています。

JDK には、Java アプリケーションを開発するために必要なさまざまなツールやライブラリが含まれているため、Java アプリケーションを開発するためには、JDK のインストールが必要です。
:::

:::note warn
JDK には、Oracle JDK や OpenJDK など複数の実装があります。ただし、Oracle JDK は**商用利用に対してライセンス費用が必要となる場合がある**ため、一般的には OpenJDK が好まれます。
:::

</details>

## 開発環境

+ Windows 11 Home 23H2 を使用しています。  

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作しますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
> wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04 LTS
Release:        24.04
Codename:       noble
```

</details>

:::note warn
この記事では基本的に Ubuntu のターミナルで操作を行います。**Vim を使用してコピペする方法**をはじめて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
:::

https://qiita.com/studio_meowtoon/items/7771ad48676926e41463

## JDK インストール

存在を確認します。

```sh
$ java -version
コマンド 'java' が見つかりません。次の方法でインストールできます:
※ 以下省略
```

OpenJDK のリストを表示します。  
※ openjdk-17-jdk があることを確認します。

```sh
$ apt-cache search openjdk
openjdk-17-jdk - OpenJDK Development Kit (JDK)
```

インストールします。

```sh
$ sudo apt update
$ sudo apt install openjdk-17-jdk
```

バージョンを確認します。

```sh
$ java -version
openjdk version "17.0.12" 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Ubuntu-1ubuntu224.04)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Ubuntu-1ubuntu224.04, mixed mode, sharing)
```

Java JDK (開発環境) を Ubuntu にインストールすることができました。

## JAVA_HOME を設定

:::note info
**JAVA_HOME** とは、Java Development Kit (JDK) のインストール場所を指定する**環境変数**の1つです。環境変数を設定することで、コマンドラインから JDK のパスを簡単に参照できます。これは、Java 開発時に便利な機能であり、ビルドツールやフレームワークなどからも使用されます。
:::

JAVA_HOME 設定を追記します。

```sh
$ vim ~/.bashrc
```

一番下へ次の4行を追加します。

```sh
# JDK
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
```

設定を反映します。

```sh
$ source ~/.bashrc
```

パスを確認します。

```sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-17-openjdk-amd64
$ echo $PATH
```

Java JDK の PATH を設定することができました。

## Hello World を表示する手順

プロジェクトフォルダーを作成します。
※ ~/tmp/hello-java をプロジェクトフォルダーとします。

```sh
$ mkdir -p ~/tmp/hello-java
$ cd tmp/hello-java
```

Java ソースファイルを作成します。

```sh
$ vim HelloWorld.java
```

ファイルの内容

```java:HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
```

:::note info
これは、Java で Hello World を表示するための最小限のプログラムです。public クラス HelloWorld を定義し、main メソッドを実装し、文字列 "Hello World!" をコンソールに出力します。
:::

コンパイルします。

```sh
$ javac HelloWorld.java
```

:::note info
**javac** は、Java プログラムをコンパイルするためのコマンドです。Java コンパイラがソースコードをバイトコードに変換し、実行可能なバイナリファイルを生成します。
:::

実行します。

```sh
$ java HelloWorld
```

:::note info
**java** は、Java プログラムを実行するためのコマンドです。このコマンドを実行すると、**Java 仮想マシン** が起動され、HelloWorld.class ファイルが実行されます。
:::

:::note warn
**Java** コマンドでは、実行するクラス名を指定する必要があります。指定されたクラス名を使って Java 仮想マシンがクラスファイルを探し、プログラムを実行します。通常、クラス名には拡張子 **.class** は付けず、クラス名のみを指定します。
:::

```sh
Hello World!
```

ターミナルに "Hello World!" と表示することができました。

プロジェクトのファイル構成を確認します。

```sh
$ sudo apt update
$ sudo apt install tree
$ tree
.
├── HelloWorld.class
└── HelloWorld.java
```

|ファイル|内容|
|:--|:--|
|HelloWorld.java|Java プログラムを記述するためのテキストファイルです。Java ソースファイルとも呼ばれます。通常、Java プログラムのコードはこのファイルに書かれます。|
|HelloWorld.class|Java プログラムをコンパイルしたバイナリファイルです。コンパイルすることによって、Java ソースコードが Java バイトコードに変換され、このファイルに保存されます。実行するためには、このファイルが必要になります。|

:::note info
HelloWorld.java は Java のソースコードを記述する**テキストファイル**、HelloWorld.class は Java ソースコードをコンパイルして生成された**バイナリファイル**です。
:::

## Java のバージョン切り替えについて

※ Ubuntu に異なるバージョンの Java JDK をインストールして、それらを適時切り替えて使用できます。  

Java 8 LTS と、Java 11 LTS をインストールします。  

```sh
$ sudo apt update
$ sudo apt install openjdk-8-jdk
$ sudo apt install openjdk-11-jdk
```

Java コンパイラのバージョンを切り替えてみます。  
※ 1で Java 11 を選択します。

```sh
$ sudo update-alternatives --config javac
alternative javac (/usr/bin/javac を提供) には 3 個の選択肢があります。

  選択肢    パス                                        優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/javac   1711      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      手動モード
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/javac   1711      手動モード
  3            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac    1081      手動モード
```

Java バージョンを切り替えてみます。
※ 1で Java 11 を選択します。  

```sh
$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 3 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      手動モード
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      手動モード
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード
```

バージョンを確認します。

```sh
$ java -version
openjdk version "11.0.24" 2024-07-16
OpenJDK Runtime Environment (build 11.0.24+8-post-Ubuntu-1ubuntu324.04.1)
OpenJDK 64-Bit Server VM (build 11.0.24+8-post-Ubuntu-1ubuntu324.04.1, mixed mode, sharing)
```

JAVA_HOME を確認します。

:::note warn
WSL Ubuntu の再ログインが必要です。Windows 11 のコマンドプロンプトで以下のコマンドを実行してください。ターミナルが終了したら、再度ターミナルを立ち上げてください。
:::

```sh
> wsl -t Ubuntu-24.04
```

Ubuntu のターミナルで確認します。

```sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64
```

※ 環境変数が Java 11 に変更されていることを確認できました。  

このように Java JDK のバージョンをプロジェクトにあわせ手軽に切り替えることができます。  

## GraalVM ビルド環境

<details>
<summary>こちらを展開してご覧いただけます。</summary>

:::note alert
学習が目的の Java 開発環境では **GraalVM** はとくに必要ありません！ GraalVM は、高速な JIT コンパイラやネイティブイメージの作成などの特徴があるため、一部の特殊な用途を除いては、通常の Java 開発環境である JDK や OpenJDK を使用することが推奨されています。
:::

### GraalVM とは？

GraalVM は、Oracle によって開発された Java 仮想マシンの1つで、Java や Kotlin、Scala などのさまざまな言語の実行や、ネイティブバイナリへの変換が可能なマルチ言語ランタイム環境です。GraalVM は、通常の Java 仮想マシンよりも高速に実行できます。また、Java コードをネイティブバイナリに変換することによって、より高速で軽量なアプリケーションを実行できるようになります。さらに、JavaScript エンジンである Node.js をホストすることもでき、複数の言語の統合において優れた柔軟性を持っています。

### GraalVM インストール

Ubuntu で Native Image ビルドを行うためには以下の手順が必要です。  

:::note warn
この記事では手動でインストールする方法を紹介しています。  
:::

GraalVM を手動で **/usr/lib/jvm/** にインストールします。

```sh
$ cd ~
$ wget https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-17.0.9/graalvm-community-jdk-17.0.9_linux-x64_bin.tar.gz
$ sudo mkdir -p /usr/lib/jvm/graalvm-ce-java17-linux-amd64
$ sudo tar zxvf graalvm-community-jdk-17.0.9_linux-x64_bin.tar.gz -C /usr/lib/jvm/graalvm-ce-java17-linux-amd64 --strip-components=1
```

インストールされた GraalVM のパスを確認します。

```sh
$ ls -la  /usr/lib/jvm/
graalvm-ce-java17-linux-amd64
```

現在インストールされた JVM を確認します。  
※ そのまま Enter します。

```sh
$ sudo update-alternatives --config java
  選択肢    パス                                          優先度  状態
------------------------------------------------------------
  0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      手動モード
* 2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      手動モード
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード
```

GraalVM を update-alternatives に設定します。  
※ 優先順位の数値を 1017 (※任意) に設定しています。  
※ GraalVM の優先順位を下げる意図があります。  

```sh
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/graalvm-ce-java17-linux-amd64/bin/java 1017
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/graalvm-ce-java17-linux-amd64/bin/javac 1017
```

GraalVM に切り替えてみます。  
※ GraalVM の番号を選択します。  

```sh
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
```

<details>
<summary>削除する場合と自動モードに戻す場合</summary>

※ 削除する場合

```sh
$ sudo update-alternatives --remove java /usr/lib/jvm/graalvm-ce-java17-linux-amd64/bin/java
$ sudo update-alternatives --remove javac /usr/lib/jvm/graalvm-ce-java17-linux-amd64/bin/javac
```

※ 自動モードに戻す場合

```sh
$ sudo update-alternatives --auto java
$ sudo update-alternatives --auto javac
```

</details>

JAVA_HOME を動的に設定しているので Ubuntu に再ログインします。  
※ WSL の場合ターミナルを閉じて再度開きます。  

バージョンを確認します。  

```sh
$ java -version
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22)
OpenJDK 64-Bit Server VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22, mixed mode, sharing)
```

JVM に GraalVM を設定することができています。  

GraalVM Updater のバージョンを確認します。  

```sh
$ gu --version
GraalVM Updater 23.0.2
```

:::note info
GraalVM Updater は、GraalVM のインストール、アップデート、アンインストールを行うためのツールです。 **gu** は、GraalVM Updater のコマンドです。
:::

Native Image コマンドをインストール（確認）します。

```sh
$ sudo $(which gu) install native-image
Downloading: Component catalog from www.graalvm.org
Processing Component: Native Image
Component Native Image (org.graalvm.native-image) is already installed.
```

GraalVM Native Image のバージョンを確認します。

```sh
$ native-image --version
native-image 17.0.9 2023-10-17
GraalVM Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22)
Substrate VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9, serial gc)
```

:::note info
GraalVM Native Image は、Java アプリケーションをネイティブコードにコンパイルし、高速かつ軽量なネイティブアプリケーションを生成するためのツールです。
:::

ネイティブバイナリへのビルドに必要なライブラリをインストールします。

```sh
$ sudo apt update
$ sudo apt install build-essential libz-dev zlib1g-dev
```

GraalVM がインストールされたことで、Java プログラムをネイティブイメージにビルドすることが可能になりました。今後、別の記事で GraalVM を使った Hello World プログラムのネイティブイメージへのビルド方法をご紹介します。

</details>

## まとめ

+ Ubuntu に Java JDK をインストールして、シンプルな開発環境を構築することができました。

:::note warn
実際の開発では、軽量なテキストエディターである **VS Code** や、**IDE (統合開発環境)** を使用して、Java プログラムを開発することが一般的です。しかし、javac コマンドでコンパイルしたり、java コマンドでクラスファイルを実行したりすることも、Java 開発環境を理解する上で役立ちます。
:::

どうでしたか？　Window 11 の WSL Ubuntu に、Java の開発環境を手軽に構築できます。ぜひお試しください。今後も Java の開発環境などを紹介しますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/f4cdc4039158153365fb