🐧

Linux 使いになりたい人のための Java 開発時に知っておきたいこと - 2024年度版

2024/04/13に公開

はじめに

最近、VS Code のプロファイル機能を使って、プログラミング言語 Java でソフトウェア開発をするときに使う、Java 開発用プロファイルを作成しようと思ったのですが、その時に、先に何を決めておく必要があるかと考えました。

当たり前のことなのですが、環境構築前に、使用する Java の種類とバージョンを決めた方が良いです。ただし、決めるにあたって必要な前提知識が結構多いです。特に、Java の場合は、最近あった何度かのライセンス変更で複雑な事情になっているように見えます。

ということで、ここでは Java 開発時に知っておきたいことを紹介します。本文で簡単な説明をしていますが、Java のプログラムの実行や開発には JRE や JDK といったものが必要です。

JRE や JDK の正確なライセンス内容については、Oracle JDK Licenseに関する一般的なFAQ | Oracle 日本 を確認してください。Oracle JDK 21 とOracle JDK 17 以降は、すべてのユーザーが無料で利用できます。それより前のバージョンについては、無料で利用できない場合があります。

JDK のバージョンと種類の選択について

まず、プログラミング言語 Java で開発するにあたっては、使用する JDK のバージョンと種類を選択する必要があります。現在、JDK にはいくつかの種類があり、サポートされる期間も様々なので、次の順番で使用するものを選択するのが良いと考えています。

  • Java ランタイム環境
  • JDK
  • DevContainer イメージ
  • Docker イメージ

Docker コンテナーを使わないと決めているなら、DevContainer イメージ、Docker イメージ については考慮する必要がありません。ただし、将来的には使うことになるでしょうから、最初から検討事項としていれとくのが良いはずです。

なお、Java のサポート期間について知っておいた方が良い基本事項として、Long-Term-Support (LTS)リリースというものがあります。LTS のものはサポート期間が LTS でないものよりも長いので、基本的に LTS のものから選択するのが良いでしょう。具体的にはバージョン 8、11、17、21 のどれかということになります。

  • Java 8
  • Java 11
  • Java 17
  • Java 21
  • Java 25(次期)

学習用途なら最新の LTS である 21 を選んでおけば良いのですが、参考にする学習用資料によっては、古いバージョンを使っている場合もあります。そういったことも考慮して決めると良いでしょう。

個人的な結論としては、2024年4月時点で開発や学習するための環境を用意するとしたら、下記にすれば良いだろうということになりました。

使用する JDK 環境
openjdk-21-jdk (apt パッケージ) Ubuntu (WSL Ubuntu を含む)
Eclipse Temurin バージョン 21 開発コンテナー(Development Container)

この結論に至るにあたって調べたことを簡単に整理したので下記に紹介しておきます。Java について詳しくない人のために、簡単に用語説明もします。

Java ランタイム環境

Java ランタイム環境とは JRE (Java Runtime Environment) のことで、この後に説明する JDK を使って開発した Java のプログラムを実行するときに必要なものです。これは、次の役割を持っています。

  • Java プログラムを効率的に実行するための仮想マシン Java VM (Java Virtual Machine) の提供
  • Java プログラムに必要なクラスライブラリやその他の機能の提供
  • Java プログラムとオペレーティングシステムの間での通信を実行

Java プログラムを利用するためには、JRE が必要なので、次のどれかをインストールします。

  • Oracle JRE
  • OpenJDK Java runtime
  • その他の JRE

Oracle JRE は、オラクル社が提供する公式な JRE です。

OpenJDK Java runtime はオープンソースコミュニティによって開発されている JRE です。Oracle JRE とほぼ同じ機能を持ち、無料で利用できます。このほかにも JRE はありますが、OpenJDK Java runtime をベースにしたものがほとんどです。そうでないものも一部ありますが、それを使うのは特殊な事情がある場合になるので、それが必要となる場面になってから検討すれば良いでしょう。

JDK

JDK とは、Java Development Kit の略で、プログラミング言語 Java でソフトウェア開発を行う際に必要なツールをまとめた開発キットです。JRE は Java プログラムを実行することしか出来ませんが、JDK は JRE へ加えて、Java プログラムを開発するためのツールとしてコンパイラやデバッガなども含まれています。

JDK に含まれていて、よく使うコマンドとしては次のものがあります。

コマンド 機能 説明
javac コンパイラ Javaソースコードを JVM が理解できるバイトコードに変換
jdb デバッガ Javaプログラムの実行をステップ実行したり、変数の値を確認したりすることが可能
jar アーカイバ 複数のファイルを一つのファイルに圧縮したり、逆に展開したりすることが可能
javadoc ドキュメント生成ツール ソースコードに埋め込めれたメタ情報からドキュメント生成が可能

JDK も JRE と同じように、大きく分けて、以下の2種類があります。

  • Oracle JDK
  • OpenJDK

Oracle JDK は、オラクル社が提供する公式な JDK です。Open JDK はオープンソースコミュニティによって開発されている JDK です。Oracle JDK とほぼ同じ機能を持ちます。

JDK には、Java でソフトウェア開発を行うために必要なツールがすべて含まれているので、Java 開発を始める際にはまず JDK をインストールする必要があります。

JRE と JDK の選択肢

JRE と JDK の選択肢にはいくつかあります。

Linux ディストリビューションのパッケージを使っておくと管理が楽になりますが、Java プログラムの開発をよくする場合は、SDKMAN! のようなツールを使うと管理がしやすくなります。

ただし、最近は開発コンテナー(Development Containers、devcontainer)を使うことも増えてきていますし、実行コンテナー(開発コンテナーと区別するため、通常のコンテナーをここでは実行コンテナーと呼ぶことにします)で環境を提供することも増えてきています。

そういったことを考慮しつつ、選択する JRE、JDK を決める必要があります。

ここで、Docker コンテナーを使うと比較的自由に JRE と JDK の切り替えができたりするのですが、開発環境との共存を考えると使いにくいと感じる場面も多くあります。そういった場合は SDKMAN! という便利なツールがあるので、これの使用についても検討しておくのが良いです。

ということで、簡単に SDKMAN! が対応している JDK について紹介します。

SDKMAN!

SDKMAN! を使うと、パソコンで使用する JDK の種類とバージョンを簡単に切り替えることができるようになります。これを使いたくなる場面について簡単に説明しておきます。

たとえば、開発案件 A では OpenJDK のバージョン 8(OpenJDK 8)、開発案件 B では Orale JDK のバージョン 21(Oracle JDK 21)を使うといった場合、両方の JDK が共存する環境を用意して、開発案件 A では OpenJDK 8、開発案件 B では Oracle JDK 21 を使うようにする必要がでてきます。これらの開発時期がずれているなら、どちらかの環境だけを用意して整備すれば良いのですが、時期が重なる場合は共存が必要です。この共存のための設定の手間が結構あるので大変になります。

こういうときに SDKMAN! を使うと簡単に共存環境を用意することができるため、人気があります。

なお、SDKMAN! がサポートしている Java は下記になります。https://github.com/sdkman/sdkman-disco-integration によると、内部的に https://api.foojay.io/ を使って一覧を作成しているようです。

Vendor 説明 URL
Corretto Amazon Corretto https://aws.amazon.com/jp/corretto/
Dragonwell Alibaba Dragonwell https://dragonwell-jdk.io/#/index
Gluon Gluon GraalVM https://github.com/gluonhq/graal
Java.net OpenJDK https://jdk.java.net/
JetBrains JetBrains Runtime https://github.com/JetBrains/JetBrainsRuntime
Liberica BellSoft Liberica JDK https://bell-sw.com/libericajdk/
Liberica NIK BellSoft Liberica Native Image Kit https://bell-sw.com/liberica-native-image-kit/
Microsoft Microsoft Build of OpenJDK https://www.microsoft.com/openjdk
Oracle Oracle https://www.oracle.com/java/
SapMachine SAP Machine https://sap.github.io/SapMachine/
Semeru IBM Semeru Runtimes https://developer.ibm.com/languages/java/semeru-runtimes/
Temurin Eclipse Temurin https://adoptium.net/temurin/
Tencent Tencent Kona JDK https://www.tencentcloud.com/jp/document/product/845/48051
Trava Trava OpenJDK https://github.com/TravaOpenJDK
Zulu Azul JDK https://www.azul.com/downloads/?package=jdk

最近、Java プログラムの開発をするにあたっては、GraalVM というものも使われるようになっているようで、SDKMAN! での Java の選択肢に GraalVM も含まれています。ここでは GraalVM についての説明は省略しますが、選択肢として下記のものがあるということだけ記載しておきます。

Vendor 説明 URL
GraalVM CE GraalVM Community Edition https://github.com/graalvm/graalvm-ce-builds
GraalVM Oracle Oracle GraalVM https://www.oracle.com/jp/java/graalvm/
Mandrel Mandrel (GraalVM CE) https://github.com/graalvm/mandrel

Ubuntu

WSL でも Ubuntu がデフォルトで採用されるので、Ubuntu で JRE や JDK を使う方法について簡単に説明しておきます。Ubuntu で LTS のものを apt コマンドでインストールするときは、次のどれかになります。apt コマンドでインストールされるものは Ubuntu のメンテナーが用意したものになるので、種類としては Ubuntu 版 OpenJDK という表現にしました。

種類 バージョン パッケージ名
Ubuntu 版 OpenJDK 8 openjdk-8-jdk
Ubuntu 版 OpenJDK 11 openjdk-11-jdk
Ubuntu 版 OpenJDK 17 openjdk-17-jdk
Ubuntu 版 OpenJDK 21 openjdk-21-jdk

たとえば、openjdk-21-jdk パッケージをインストールする場合は次のようにします。

sudo apt -y install openjdk-21-jdk

なお、OpenJDK ではなく、OpenJDK Java runtime をインストールしたい場合は、openjdk-8-jre のように、最後の jdkjre へ置き換えたパッケージ名にしてインストールします。

ここで、Ubuntu へ SDKMAN! をインストールすると、SDKMAN! で Ubuntu 版の OpenJDK をデフォルトにして使えるようにしておきたい場合があります。そういった場合は、どうすれば良いかというと、SDKMAN! では使用するバージョンを登録することができるので、その機能を使います。

たとえば、Ubuntu 版の OpenJDK として、default-jdk (OpenJDK 11) を使うときは、次のように default-jdk をインストールしてから、それを system というバージョン名で登録して使えるようにすれば解決します。

$ sudo apt -y install default-jdk
$ sdk install java system /usr/lib/jvm/default-java
Linking java system to /usr/lib/jvm/default-java
Done installing!
$ sdk default java system

サポート期限(EOL)

使用する Java のサポート期限(EOL、End Of Life)についても確認した上で決めると良いでしょう。あまり頻繁に更新しないシステムならサポート期間が長い方が良いはずです。

たとえば、サポート期限が先のものを優先的に選択したい場合は、Java 11 LTS よりも Java 17 LTS の方が良くて、なかでも Amazon Corretto のサポートが長いので、これを選択するということになります。

サポート期限について調べるには、https://endoflife.date のサイトが便利です。

各 JDK の公式サイトで確認する場合の URL も一覧にしてみました。正確性が求められる場合は、これらを参照した方が良いです。

なお、Linux ディストリビューションのパッケージを検索する URL を確認することで、Linux ディストリビューションが配布するパッケージの EOL を知ることができます。

Linux ディストリビューションのパッケージは、独自にパッチをあてるなどして、本家でのサポートが終了してもサポートが続く場合があるので、そのあたりも考慮しながら利用するかしないかを決めると良いでしょう。

開発コンテナー

Java に対応する開発コンテナー用イメージとしては、Microsoft が公開しているものがあります。

これを使うと SDKMAN! が含まれる開発用コンテナーになり、本記事執筆時点(2024年4月)では、初期状態で 21.0.2-tem(Eclipse Temurin 21.0.2)がインストールされたものになりました。

ちなみに、Java 8 用のものは上記のものとは別にあります。

SDKMAN! でない方が良い場合は、Debian、Ubuntu をベースとする開発コンテナー用のイメージがあるので、そちらを独自にカスタマイズして用意するということになります。

コンテナーイメージの選択肢

開発コンテナーでない場合のコンテナーイメージの選択肢としては次のようになります。Docker Hub 以外で公開されているものもあるので注意しましょう。少しわかりにくいのですが、イメージ用のページにリンクしていないものもあります。また、Docker Hub 以外から取得したい場合もあるはずなので、同じイメージで Docker Hub 以外の Docker レジストリがある場合は、それも記載しています。

なお、Bellsoft Liberica のものはディストリビューションによって公開 URL が違っていたので、たくさんあるように見えます。

開発環境

個人的には、最近はどのプログラミング言語を使うにしても、開発環境としては VS Code を選択しています。ただ、Java 用の開発環境としては、有名なものとして、IntelliJ IDEA、Eclipse IDE、Apache NetBeans などがあります。使用する開発環境が対応する Java を選択する必要もあるでしょう。

参考資料

Discussion