torutkのブログ

ソフトウェア・エンジニアのブログ

Redmine 5.0.0がリリースされていました

Redmine 5.0.0リリース

先月末の3月28日に、Redmine 5.0.0がリリースされていたことを知りました。

Redmine 5.0.0 リリース | Redmine.JP Blog

今回のメジャーバージョンアップでは、Rails 5.2から6.1への移行がなされ、合わせて Zeitwerkというオートロードに対応したとのことです。従来のclassicオートローダーはRails 6では非推奨で、Rails 7で廃止となります。この変更で、一部のプラグインが動作しなくなりプラグイン側で修正が必要となります。

その他、多数新機能が追加されています。

Redmine 4.2から5.0へのアップデート

Rocky Linux 8.5上で稼働しているRedmine 4.2(Unicorn + Nginx)を、Redmine 5.0にアップデートします。およその手順は次です。

Redmine 5.0 を github からクローン
~$ cd /var/lib
lib$ sudo git clone -b 5.0-stable https://github.com/redmine/redmine.git redmine-5.0-stable
lib$ sudo chown -R redmine:redmine redmine-5.0-stable/
Redmine 4.2のディレクトリから設定ファイルをRedmine 5.0のディレクトリへコピー
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/config/configuration.yml config
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/config/database.yml config
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/config/unicorn.rb config
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/config/additional_environment.rb config
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/Gemfile.local .
redmine-5.0-stable$ cp -p ../redmine-4.2-stable/config.ru .
redmine-5.0-stable$ 
Redmine 4.2 のディレクトリ下からプラグインRedmine 5.0のディレクトリへコピー

まず、Redmine 4.2のディレクトリ下からプラグインをコピーします。

lib$ cd redmine-5.0-stable
redmine-5.0-stable$ cp -pr ../redmine-4.2-stable/plugins/* plugins/
redmine-5.0-stable$ ls plugins/
README                    redmine_glossary         redmine_wiki_lists
google_analytics_plugin   redmine_issue_templates  redmine_xls_export
redmine_banner            redmine_latex_mathjax    sidebar_hide
redmine_cozy_wiki_macros  redmine_theme_changer    view_customize
redmine_github_hook       redmine_wiki_extensions
redmine-5.0-stable$ 

プラグインディレクトリで git pull 等を実行して最新にします。

また、各プラグインRedmine 5.0に対応しているかどうか配布元サイト等を確認しておきます。 (2022年4月24日調べ)

No. Plugin name Redmine 5.0対応 zeitwerk:check結果 最新版状況 備考
1 google_analytics_plugin 未記載 最新版v1.0.1は2020年
2 redmine_banner 未記載 最新版v0.3.4は2020年7月 agileware-jpフォーク版が対応
3 redmine_cozy_wiki_macros 未記載 最新版v0.3.1は2019年12月
4 redmine_github_hook 未記載 最新版v3.0.1は2019年7月
5 redmine_glossary 未記載 最新版v1.1.0は2020年1月
6 redmine_issue_template 未記載 最新版v1.1.0は2020年8月 agileware-jpフォーク版が対応
7 redmine_latex_jathjax 未記載 最新版は2020年4月
8 redmine_theme_changer 対応済み 対応版 v0.5.0
9 redmine_wiki_extensions 対応済み 対応版 v0.9.3
10 redmine_wiki_lists 未記載 最新版は2021年4月
11 redmine_xls_export 未記載 最新版v0.2.1.t11は2018年12月
12 sidebar_hide 未記載 最新版v0.0.8は2017年1月
13 view_customize 未記載 最新版v3.0.1は2022年1月
Redmine 4.2のディレクトリからテーマファイルをRedmine 5.0のディレクトリへコピー
redmine-5.0-stable$ ls public/themes/
README  alternate  classic
redmine-5.0-stable$ rsync -av --exclude alternate --exclude classic ../redmine-4.2-stable/public/themes/ public/themes/
redmine-5.0-stable$ 

各テーマ(alternateとclassicを除く)のディレクトリで git pull 等を実行して最新にします。

Redmine 5.0のディレクトリで必要なgemsをインストール
redmine-5.0-stable$ bundle install --path vendor/bundler --without development test
    :
Bundle complete! 50 Gemfile dependencies, 85 gems now installed.
    :
Redmine 5.0 のディレクトリで、5.0に非対応なプラグインをチェック

zeitwerk オートロードに対応しているかどうかをチェックします。エラーが発生するとそこでとまるようなので、非対応なプラグインを検知したらそのプラグインディレクトリを削除して、という作業を繰り返します。

redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
rake aborted!
LoadError: cannot load such file -- google_analytics_hooks
  :
redmine-5.0-stable$ rm -rf plugins/google_analytics_plugin/
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
rake aborted!
LoadError: cannot load such file -- banners/application_hooks
  :
redmine-5.0-stable$ rm -rf plugins/redmine_banner/
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
rake aborted!
LoadError: cannot load such file -- issue_templates/issues_hook
  :
redmine-5.0-stable$ rm -rf plugins/redmine_issue_templates
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
rake aborted!
LoadError: cannot load such file -- xlse_asset_helpers
  :
redmine-5.0-stable$ rm -rf plugins/redmine_xls_export/
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
rake aborted!
LoadError: cannot load such file -- sidebar_hook_listener
  :
redmine-5.0-stable$ rm -rf plugins/sidebar_hide/
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
Hold on, I am eager loading the application.
rake aborted!
NameError: uninitialized constant RedmineGithubHook::Version
Did you mean?  RedmineGithubHook::VERSION
  :
redmine-5.0-stable$ rm -rf plugins/redmine_github_hook/
redmine-5.0-stable$ bundle exec rake zeitwerk:check RAILS_ENV=production
Hold on, I am eager loading the application.
All is good!

この段階で、けっこう厳しい状況が分かりました。 banner、issue_template、github_hook、は使いたいので、もうちょっとRedmine 5.0対応は待った方がよさそうです。

ということで、次の作業は中断とし、しばらく様子見をすることにしました。

bannerとissue_templateは、フォーク版で対応していることが分かりました。以降に処置を記述しました。 github_hookは作者がRedmineを使わなくなったので後継者を募集中です。そのため処置が遅れそうです。また、フォーク版をざっと探しましたが対応しているものが見つからずでした。

非対応なプラグインの処置
google_analytics_plugin

Redmine 4.2のディレクトリでアンインストールします。

~$ cd /var/lib/redmine-4.2-stable
redmine-4.2-stable$ bundle exec rake redmine:plugins:migrate NAME=google_analytics_plugin VERSION=0 RAILS_ENV=production
redmine_banner

フォーク版が対応しているので、フォーク版をclone

redmine-5.0-stable$ cd plugins
plugins$ git clone https://github.com/agileware-jp/redmine_banner.git
  :

データベースの変更はないので、ディレクトリを削除しcloneすればOKのはず。

redmine_issute_template

フォーク版が対応しているので、フォーク版をclone

plugins$ git clone https://github.com/agileware-jp/redmine_issue_templates.git
  :
redmine_github_hook

Redmine 4.2のディレクトリでアンインストールします。

~$ cd /var/lib/redmine-4.2-stable
redmine-4.2-stable$ bundle exec rake redmine:plugins:migrate NAME=redmine_github_hook VERSION=0 RAILS_ENV=production
redmine_xls_export

Redmine 4.2のディレクトリでアンインストールします。

~$ cd /var/lib/redmine-4.2-stable
redmine-4.2-stable$ bundle exec rake redmine:plugins:migrate NAME=redmine_xls_export VERSION=0 RAILS_ENV=production
sidebar_hide

Redmine 4.2のディレクトリでアンインストールします。

~$ cd /var/lib/redmine-4.2-stable
redmine-4.2-stable$ bundle exec rake redmine:plugins:migrate NAME=sidebar_hide VERSION=0 RAILS_ENV=production
Redmine 5.0のディレクトリでマイグレート実行
Redmine 本体のデータベースマイグレーション
redmine-5.0-stable$ bundle exec rails db:migrate RAILS_ENV=production
== 20210704125704 AddTwofaRequiredToGroups: migrating =========================
-- add_column(:users, :twofa_required, :boolean, {:default=>false})
   -> 0.0113s
  :
== 20220224194639 DeleteOrphanedTimeEntryActivities: migrating ================
== 20220224194639 DeleteOrphanedTimeEntryActivities: migrated (0.0382s) ========
redmine-5.0-stable$ 
プラグインマイグレーション
redmine-5.0-stable$ bundle exec rails redmine:plugins:migrate RAILS_ENV=production
redmine-5.0-stable$ 

特に更新なし

Redmine 4.2のディレクトリから添付ファイルをRedmine 5.0のディレクトリへコピー
redmine-5.0-stable$ rsync -a ../redmine-4.2-stable/files/ files
redmine-5.0-stable$ 
セッション鍵の生成
redmine-5.0$ bundle exec rake generate_secret_token
Unicorn 設定ファイルの変更
/usr/lib/systemd/system/redmine-unicorn.service
- WorkingDirectory=/var/lib/redmine-4.2-stable
+ WorkingDirectory=/var/lib/redmine-5.0-stable

- PIDFile=/var/lib/redmine-4.2-stable/tmp/pids/unicorn.pid
+ PIDFile=/var/lib/redmine-5.0-stable/tmp/pids/unicorn.pid
config/routes.rb
Rails.application.routes.draw do
-   root :to => 'welcome#index', :as => 'home'
+  root :to => 'wiki#show', :project_id => 'swe', :as => 'home'

Unicorn を再起動

~$ sudo systemctl restart redmine-unicorn.service

転職3ヶ月経過

転職3ヶ月経過しました

昨年11月末に、29年勤務した会社を退職し、12月1日から宇宙分野の会社に勤務開始しました。スペースデブリの除去や衛星の寿命延命といったサービスをこれから手掛ける会社です。

新しい環境に適応するのは大変なことです。そこで、次のステップを意識しました。

  • 最初の3日間をクリアすること
  • 次の3週間をクリアすること
  • 3ヶ月をクリアすること

最初の3日はけっこうつらいですが、なんとか3日が過ぎたら、次は3週間をクリアすることを目標にします。ドメイン知識がないので、とびかう略語も分からず、略語表をみながら、必死に知識を獲得していかなければなりませんでした。分からなければ質問してね、ということも、質問できるにはそれなりの知識があっての話です。最初の頃は、質問することさえできず、メンタル的にかなりハードな日々でした。最初の1,2週間は、週末は知恵熱がでるような感じでした(年齢故か発熱はしなかったです)。

そうこうしているうちに、なんとか3週間が過ぎ、年末年始の休暇で一息つきました。年末は本当にほっとしました。今年はカレンダー的に年末年始の休みが少ない(1月4日から勤務開始)ですが、それでも大分リフレッシュにはなりました。

年明けになり、次の目標は入社3ヶ月のクリアです。いろいろな作業で怒涛のような日々をすごしているうちに、2月末を迎え、転職してから3ヶ月が経過しました。

確定申告

前職を11月末に退職したので、年末調整は転職先の会社でするかと思いましたが、12月勤務開始の場合は初給与が1月になるので、年末調整対象ではないため、自力で確定申告をする必要がありました。

確定申告の期限は3月15日なので、そろそろやばいとこの週末で実施しました。

マイナンバーカードを取得している場合、スマートフォンマイナンバーカードの読み取りをすることでe-TAXというオンラインの申告ができるようになっていました。 前職から送付された源泉徴収票と、生命保険、医療費などの費用を記載し電子的に送付することで申告ができました。

確定拠出年金の移行

次に残っているのが、企業型確定拠出年金の移行です。転職先にはこの制度がないので、個人型確定拠出年金に移行しなくてはなりません。期限があるのでそろそろやばいです。

macOS上でJava開発キット(OpenJDK)を使う

macOS上でOpenJDKディストリビューションを使う

はじめに

Javaプログラミングをするには、OpenJDKディストリビューションと呼ばれるJava開発キット(Java Development Kit)の中から適したものを選択しインストールします。

ここで、OpenJDKとは、GPLv2クラスパス例外のライセンスで提供されるオープンソースプロジェクトとその成果物であるソースコードです。このOpenJDKソースコードをいくつかの組織がビルドしてJavaプログラミングをする開発者にバイナリとして提供しているのがOpenJDKディストリビューションとなります。

OpenJDKディストリビューションは、macOS向けに提供されているものが多くあります。macOS上でJavaプログラミングをするには、これらOpenJDKディストリビューションの中から適したものを入手してインストールします。

macOSに対応しているOpenJDKディストリビューション

いくつかOpenJDKディストリビューションを列挙します。

かなり多数あるため、選択肢が非常に多く迷ってしまいます。

Oracle JDK

商用製品なので有償となりますが、Oracle JDK 17では期間限定で無償利用できるOracle No-Fee Terms and Conditions(NFTC)ライセンスが追加されました。これは、次のLTSバージョンリリース日から1年後までの間、商用利用でも無償で利用できるライセンスです。ただし、その期限を過ぎるとNFTCライセンスが失効した後のアップデートはOracle Technology Network(OTN)ライセンスが適用されるためでの提供となる、商用利用がライセンス違反となってしまう点に注意が必要です。 サポート期間が相当に長く、Oracle社から技術サポートが提供されるので、安定した運用に適しています。

Oracle OpenJDK

サポート期間が半年(次のバージョンがリリースされるまで)と短いですが、無償で利用できます。 新しいバージョンを次々試すといった用途に適しています。

JavaFX同梱JDK

Azul Systems社が提供するZuluFxと、BellSoft社が提供するLiberica JDK full版には、JavaFXが同梱されています。JavaFXライブラリを利用したJavaアプリケーションの開発・実行にはこれを利用すると便利です。 LTS版については長期間アップデートが提供されます。

macOSへのOpenJDKディストリビューションのインストール

OpenJDKディストリビューションの提供元サイトから個別にOpenJDKのインストールイメージをダウンロードする方法の他、Homebrewでインストールすることもできます。

OpenJDKディストリビューションは、四半期毎にアップデートがあるので、個別にチェックするのはかなり手間となります。そこで、Homebrewのようなソフトウェアパッケージ管理ツールを使ってインストールやアップデートするのが便利です。

HomebrewでOpenJDKディストリビューションをインストール

Homebrewは、macOSで主にオープンソースのソフトウェアパッケージをインストールするサードパーティ製(Apple以外)の管理ツールです。OpenJDKディストリビューションはいずれもHomebrewを通じてインストールすることができます。

HomebrewでOpenJDKを選択、インストールする情報について、以下のWikiに記載しています。

Homebrew - ソフトウェアエンジニアリング - Torutk

macOS上でのバックスラッシュと円マークの違いにハマる

macOS上で文字は、バックスラッシュと円マークが区別される

macOS文字コードUnicodeUTF-8)で扱います。プログラミングしているソースコードUTF-8で扱われます。このUTF-8では、バックスラッシュ「\」と円マーク「¥」はそれぞれ別な文字として扱われ、文字コードも異なります。バックスラッシュは0x5cの1バイトで表現され、円マークは0xc2 0xa5の2バイトで表現されます。

JIS配列のMacBookのキーボードで右上端の方にある[¥]キーを打鍵すると、円マーク「¥」がエディタに入力・表示されます。

Windows日本語環境でソースファイルの文字コードUTF-8としたとして

Windows環境でも、Javaプログラミングの際はソースファイルの文字コードUTF-8にすることが多いです。しかし、Windows環境で使用するフォントによってバックスラッシュ文字(UTF-8で0x5c)は、バックスラッシュとして表示されたり、円マークとして表示されたりします。英語フォントでは前者、日本語フォントでは後者が多いです。ただし、日本語フォントでもプログラミングむけとされるフォントなどでは前者となるものもあります。

そのため、Windows日本語環境を長年使っていると、半角のバックスラッシュも半角の円マークも同じ文字という認識になります。

macOS上で正規表現を使うプログラミングをしていたら

macOS上でJavaプログラミングをしていたら、正規表現の処理がなぜかうまくいかない状況に陥ってしまいました。 次は、macOS上でEclipseJavaソースコードを記述した時のものです。(キーボードから打ち込んだ)

f:id:torutk:20211225211135p:plain
macOSEclipse上で正規表現を使う記述をした(円マーク使用)

ところが実行すると、正規表現にマッチしません。おかしい。 そこで、ターミナルでコマンドラインからjshellを起動し、対話モードで正規表現を試してみました。

f:id:torutk:20211225212915p:plain
macOSのターミナル上でjshellを起動し対話モードで正規表現を使う

ターミナル上の対話モードでは正規表現にマッチします。なぜ、と悩みました。

そこで、何か見落としている違いがあるのではとターミナル上の正規表現Eclipse上にコピーペーストして比較してみました。

f:id:torutk:20211225213350p:plain
Eclipse上でキー入力した正規表現文字列とターミナル上からコピーペーストした正規表現文字列

特に間違っている箇所はなさそうです1

そこで、何か見えないところに違いがあるのではないかと、ソースファイルをヘキサダンプしてみました。

f:id:torutk:20211225215634p:plain
キー入力した正規表現とターミナルからコピペした正規表現をファイルのヘキサダンプで比較

^¥¥|の部分と^\\|の部分を図で赤枠で囲っていますが、バイナリで見ると文字コードが違うことがわかります。円マーク「¥」は、0xc2 0xa5 となっており、バックスラッシュ「\」は、0x5cとなっています。

そこで、ソースコード正規表現をバックスラッシュに書き直したら、問題なく動作するようになりました。 JIS配列のMacBookでは、option + ¥ キーでバックスラッシュが入力されます。

f:id:torutk:20211225220257p:plain
macOS上のEclipseで円マークをバックスラッシュに書き換えた

UTF-8環境では、半角の円マークと半角のバックスラッシュが違う

一般的な呼び方 記号 Unicode Unicode UTF-8 Shift JIS
バックスラッシュ \ Reverse Solidus U+005C 0x5C 該当なし
円マーク ¥ Yen Sign U+00A5 0xC2 0xA5 0x5C

Windows日本語環境では、US ASCIIの文字コードを流用しつつ0x5Cの文字をバックスラッシュから円マークに置き換えた文字集合が使われています。そのため、バックスラッシュと円マークが同じ文字コードと認識しがちです。

一方、UTF-8ではバックスラッシュと円マークが区別されています。

IntelliJ IDEAであれば

f:id:torutk:20211225224736p:plain
IntelliJ IDEAで正規表現記述と円マーク、バックスラッシュのハイライト表示

macOS上でIntelliJ IDEAを使ってソースコードを表示すると、文字列中での正規表現のハイライト(色付け)がバックスラッシュと円マークで異なっているのが分かります。


  1. この時点で、同じエディタ上に円マーク「¥」とバックスラッシュ「\」が同居していることに気づけばよかったのですが。

Scene Builder 17とWindowsインストーラー

Scene Builder 17のWindowsインストーラ

久々に、JavaFXの画面レイアウトツール Scene Builderを立ち上げ、[ヘルプ]メニューから[更新の確認]を実行したら、新しいバージョンがあるとのこと。そこで、Scene Builder 17のWindowsインストーラーファイル(MSI形式)をダウンロードしてきました。9月には出ていたのですね。

gluonhq.com

このWindowsインストーラーは、デフォルトでユーザー固有(C:\Users\<ユーザー名>\AppData配下)の場所にScene Builderをインストールする設定でした。インストーラーの画面でインストール先をC:\Program Files\Scene Builderに変更したところ、権限不足でインストールできないとエラーになりました。

どうやら、システム共通領域にインストールする管理者権限への昇格がないインストーラーのようです。 まあ、最近はシステム共通にはいれずユーザー固有の場所に入れるソフトウェアが多くなってきているように思います。

さて、このWindowsインストーラー(MSI形式)を管理者権限で実行すれば、所望のC:\Program Files配下に入れれるのではと考えましたが、エクスプローラー上でどう操作しても、管理者として実行するメニューが見当たりません。調べると、Windowsインストーラーはそれがないようです。

そこで、コマンドプロンプトを管理者として実行し、コマンドプロンプトからWindowsインストーラーを実行することで管理者権限でインストーラーが実行されます。これであれば、C:\Program Filesの下にScene Builderを入れることができます。

C:\Users\torutk\Download> msiexec /i SceneBuilder-17.0.0.msi

Scene Builder 17のWindows版は、Scene Builder 16で解消した日本語環境での文字化けは再発していませんでした。よかった。

Scene Builder 17とWindowsインストーラー

Scene Builder 17のWindowsインストーラ

久々に、JavaFXの画面レイアウトツール Scene Builderを立ち上げ、[ヘルプ]メニューから[更新の確認]を実行したら、新しいバージョンがあるとのこと。そこで、Scene Builder 17のWindowsインストーラーファイル(MSI形式)をダウンロードしてきました。9月には出ていたのですね。

gluonhq.com

このWindowsインストーラーは、デフォルトでユーザー固有(C:\Users\<ユーザー名>\AppData配下)の場所にScene Builderをインストールする設定でした。インストーラーの画面でインストール先をC:\Program Files\Scene Builderに変更したところ、権限不足でインストールできないとエラーになりました。

どうやら、システム共通領域にインストールする管理者権限への昇格がないインストーラーのようです。 まあ、最近はシステム共通にはいれずユーザー固有の場所に入れるソフトウェアが多くなってきているように思います。

さて、このWindowsインストーラー(MSI形式)を管理者権限で実行すれば、所望のC:\Program Files配下に入れれるのではと考えましたが、エクスプローラー上でどう操作しても、管理者として実行するメニューが見当たりません。調べると、Windowsインストーラーはそれがないようです。

そこで、コマンドプロンプトを管理者として実行し、コマンドプロンプトからWindowsインストーラーを実行することで管理者権限でインストーラーが実行されます。これであれば、C:\Program Filesの下にScene Builderを入れることができます。

C:\Users\torutk\Download> msiexec /i SceneBuilder-17.0.0.msi

Scene Builder 17のWindows版は、Scene Builder 16で解消した日本語環境での文字化けは再発していませんでした。よかった。

macOS上でのJava開発環境

macOSJava開発キット(JDK)を入れる

JDKの提供サイトからmacOS用のdmgファイルを入手して実行するのがオーソドックスなやり方です。

他には、Homebrewと呼ばれるソフトウェアのパッケージ管理ツールを入れて、Homebrew経由でJDKを入れる方法もあります。Homebrewで管理されているパッケージであれば、個別に提供サイトを巡回して更新バージョンを確認し、更新があれば再度dmgファイルを入手してインストールするといった手間が省けます。

そこで、ここではHomebrew経由でJDKを入れる方法をメモします。

Homebrewを入れる方法は、次に記述しました。

Homebrew - ソフトウェアエンジニアリング - Torutk

Homebrewで入手できるJDK

OpenJDKディストリビューション Homebrewパッケージ名 リポジトリ 備考
Oracle JDK oracle-jdk Casks 17.0.1
Oracle OpenJDK openjdk Formulae 17.0.1
Oracle OpenJDK openjdk@?? Formulae ?? には、8と11が存在
Eclipse Temurin temurin Casks 17.0.1,12
Eclipse Temurin temrin?? cask-versions ?? には、8と11が存在
Azul Zulu zulu Casks 17.0.1,17.30.15-ca
Azul Zulu zulu?? cask-versions ?? には、7, 8, 11, 13, 15が存在
Azul ZuluFX zulufx Casks JavaFX搭載、15.0.5,15.36.51-ca
Amazon Corretto corretto Casks 17.0.1.12.1
Amazon Corretto corretto?? cask-versions ?? には、8と11が存在
Bellsoft Liberica liberica-jdk?? bell-sw/liberica ?? には、8, 11, 12, 13, 14, 15, 16, 17が存在
Bellsoft Liberica liberica-jdk??-full bell-sw/liberica JavaFX搭載。?? には、8, 11, 12, 13, 14, 15, 16, 17が存在
Microsoft Build OpenJDK microsoft-openjdk Casks 17.0.1.12.1
Microsoft Build OpenJDK microsoft-openjdk?? cask-versions ?? には、11が存在
SAP Machine sapmachine-jdk Casks 17.0.1
  • FormulaeとCasksは、Homebrewインストールで設定されますが、それ以外のリポジトリは、追加のtap指定が必要

通常、最新バージョンがインストールされます。本日時点であれば、2021年9月にリリースされた JDK 17の2021年10月更新版がインストールされるかと思います。

しかし、開発対象が最新バージョンではなく、例えば JDK 11であったりした場合は、そのバージョンのJDKをインストールしたくなります。そこで、上述の表で ?? とバージョン番号がパッケージ名称に付くものをインストールします。

OpenJDKディストリビューションについては、次に記載しました。

OpenJDK - ソフトウェアエンジニアリング - Torutk

Zulu11をインストール

先のLTS版であるJDKのバージョン11で、Appleシリコン(M1チップセット、ARM命令セット)に対応しているものの一つがZuluです。

zulu?? は、cask-versions リポジトリを使用するので、tapで指定します。

% brew tap homebrew/cask-versions

続いて、インストールします。

% brew install --cask zulu11

インストール後は環境設定を特にせずともjavaコマンドが使えました。/usr/bin/java コマンド他が追加されています。

liberica-jdk17-full をインストール

JavaFXを搭載し、最新LTS版(OpenJDK 17)である17を含むパッケージ名である Bell Soft社のLiberica JDKです。

% brew tap bell-sw/liberica
% brew install --cask liberica-jdk17-full

先にzulu11を入れた環境にliberica-jdk17-fullをインストールした後、javaコマンドはこのliberica-jdk17-fullを指すようになりました。

macOSで複数バージョンのOpenJDKを併用する場合の設定

macOSでは、通常 OpenJDKをインストールすると、次の場所に置かれます。

/Library/Java/JavaVirtualMachines/
  +-- liberica-jdk-17-full.jdk/
  +-- zulu-11.jdk/

そして、/usr/bin/java などのコマンドがどのOpenJDKを指すのかを管理しているのが @/usr/libexec/java_home@ツールです。

オプションなしで実行すると、現在アクティブなOpenJDKのパスを表示します。

% /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/liberica-jdk-17-full.jdk/Contents/Home

オプション-Vを付けると、インストール済みのOpenJDKの一覧と、現在アクティブなOpenJDKのパスを表示します。

% /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    17.0.1+12-LTS (arm64) "BellSoft" - "BellSoft Liberica JDK 17.0.1+12" /Libray/Java/JavaVirtualMachines/liberica-jdk-17-full.jdk/Contents/Home
    11.0.13 (arm64) "Azul Systems, Inc." - "Zulu 11.52.13" /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/liberica-jdk-17-full.jdk/Contents/Home

オプション-v <バージョン番号>を付けると、指定したバージョンのOpenJDKのパスを表示します。

% /usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home

環境変数JAVA_HOMEに、このjava_homeコマンドの結果を設定します。

% export JAVA_HOME=`/usr/libexec/java_home -v 11`
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
% java --version
openjdk 11.0.13 2021-10-19 LTS
OpenJDK Runtime Environment Zulu11.52+13-CA (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM Zulu11.52+13-CA (build 11.0.13+8-LTS, mixed mode)

/usr/bin/java などのJDKコマンドは、デフォルトでは最新のOpenJDKバージョンを実行しますが、環境変数JAVA_HOMEが設定されていると、それが示すパスのOpenJDKを実行します。

  • 異なるディストリビューションで同じバージョンを入れている場合、指定が困難です。その時は、JEnvを導入すると解決できるようです。