torutkのブログ

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

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を導入すると解決できるようです。

初めてのテレワーク

初めてテレワークを実施した

先週12/1に転職し、3日間通勤しました。転職先はテレワークを導入しています。そこで、土日で疎通確認を実施して良好だったので月曜日は在宅勤務でテレワークを実施しました。前職ではテレワーク適用はない部署であったので、人生初のテレワークでした。

先週の3日間は、新しい勤務先で慣れない環境であったこともあり、かなり緊張していたので疲労も著しいものがありました。とくに水分を十分とる余裕がなかったです。

週明けの月曜日は、テレワークで自宅のため、ちょっとした合間に水分を取ることもでき、静かで落ち着いて作業ができました。天候も曇りで暑すぎることもなく(冬は太陽の軌道が低く、晴れの日は窓から日光が部屋の中まで差し込み温室状態になります)、快適に過ごしました。

ただし、一日の歩数は著しく低下してしまいました。朝ちょっと買い物にでたときと、昼弁当を買いに出たときに歩いただけです。まだ仕事のペースがつかめず、途中で休憩やストレッチする余裕がまったくなく、体がガチガチになってしまいました。

あとは、テレワークではWeb会議で込み入った話をするときに、ホワイトボードに書きながらということができないので替わりのツールを見つけ使いこなさないといけないなと思いました。

あるいは小さなホワイトボードに手書きでカメラに写すとか?

MacBook を初めて使う

仕事で使うPCで、WindowsMacかの選択肢が与えられた

転職し、この12月1日から新しい会社での勤務が始まりました。 貸与されるPCは、WindowsMacから選択が可能でした。 今回、あえてMacを選択してみました。MacであればUNIXシェル環境が使え、いろいろなプログラミングがやりやすそうであるし、ここでmacOSを使ってみるもの楽しみと考えてのことです。

Macは昔PowerPC 601を搭載したPowerMacintosh 7500(OSが漢字Talk 7.5)を購入し使っていましたが、それ以降はWindowsマシンを中心に、ときどきLinuxマシンを使っていました。

貸与されたのは、13インチMacBook Pro です。

ちなみに職場で周囲をみるとほとんどがWindowsマシンで、MacBookは少数派のようでした。

WindowsユーザーがMacに移るときにはまる事柄(使い始め数日まで編)

WindowsユーザーがMacを触ると、やはり違いにはまります。ここでは使い始めて3日ほど、メール、ブラウザ、Microsoft Officeのドキュメント閲覧等で困ったことを中心にメモします。

テキストのコピー・ペーストができない

キーバインドが違うので、Windows流の Ctrl-C, Ctrl-Vではコピーペーストができません。また、右クリックでポップアップメニューをだそうとトラックパッドの右隅をクリック(Windowsユーザー目線では右クリック)してもだめでした。

しばらくして、ああコマンドキー(⌘)をつかうんじゃなかったかなと⌘-C ⌘-V でコピーペーストができるようになりました。

トラックパッドで右クリックができない

1) Ctrlキーを押しながら左クリック、または 2)トラックパッドを2本指でタッチすると右クリックになりました。

システム環境設定のトラックパッドで、右クリックの操作を変更することはできますが、ここはデフォルトのまま使って慣れるようにします。

もともとマウスはボタン1つというMacintoshのユーザーインタフェースの流れが残っているような操作感です。

スクロールバーがでないことがある

Webブラウザで作業しているときに、カーソルを右端付近に持って行ってもスクロールバーがでないことがわりと頻繁にあります。macOSでは、スクロールバーは必要に応じて表示されるようになっていますが、「必要に応じ」に反応してもらえないような状況です。 回避策としてはカーソルキーの上下キーでスクロールさせることはできますが、ブラウザ閲覧中はトラックパッドに指を置いているのでキーボードを使うのが煩雑となります。 そこで、設定でスクロールバーを常時表示としました。[システム環境設定] > [一般] で、スクロールバーの表示を[常に表示]に変更します。

  • 別な回避策)トラックパッド上を2本指で上下にスライドすることでスクロールできます
Microsoft Office文書やPDF閲覧時のページ送りができない

Windowsでは、PgUp、PgDn キーで、Office文書やPDF文書をページ単位で前後に閲覧することができました。 Macでは、そのようなキーが見当たりませんが、次の方法があるようです。

Windowsでの操作キー MacBookでの操作キー
PgUp fn + ↑
PgDn fn + ↓
Home fn + ←
End fn + →

トラックパッド上でのジェスチャでもページ送り機能があるようです。 * トラックパッド上を2本指で左右にスライドするとページ送りができるようです

表示の拡大縮小はどうやれば?

Office文書やブラウザの表示を拡大・縮小する方法が分かりませんでした。

トラックパッド上でのジェスチャでできるようです。

  • 2本指でピンチ操作
  • 2本指でダブルタップ ⇒ Officeツールでは反応なし、Webブラウザではスマートズーム(コンテンツに応じ拡大⇔縮小)
画面キャプチャはどうすれば?

スクリーンショットというアプリケーション(ツール)を使います。スクリーンショットの実行は次のどちらかで可能です。

スクリーンショットはデフォルトではデスクトップに自動でファイル名を付けて保存するので、クリップボードにコピーしたい場合は、スクリーンショットのオプションで設定を変更します。

Doc(画面下側のアプリケーション起動ショートカットツール)の設定を変えたい

デフォルトでは、業務では使わないツールが画面下側のDocに並んでいます。不要なアイコンをDocから削除するには、次の方法があります。

  • Docからアイコンを削除するには、アイコンをDocから上へ一定距離ドラッグしてドロップ
  • アイコンを右クリックしオプション > 削除

必要なツールをDocに登録したいときは次の方法があります。

  • Launchpadを開き、アプリケーションのアイコンをDocにドラッグ&ドロップ
Docのアイコンの大きさを変えたい

システム環境設定のDocとメニューバーから、Dockサイズの変更が可能です。

UNIXシェル環境

Launchpadから、その他 > ターミナル でUNIXシェル環境のターミナルが開きます。 デフォルトでは、zshとなっています。

トラックパッドのいろいろな操作

MacBookトラックパッドでは、いろいろなジェスチャー機能があるようです。

support.apple.com

T.B.D.

周辺機器を使うには

MacBook Pro 13インチ(2020年)本体にあるコネクタ類は、USB Type-C インタフェースが2つとサウンド端子(3.5mmΦ)が1つあるだけです。電源は USB Type-Cに接続します。外付けディスプレイへの出力はUSB Type-Cに繋ぎます。するとそれでUSBコネクタが埋まってしまうので、マウス、USBメモリ、有線LAN、USBヘッドセットなどを使うにはUSBハブを追加する必要があります。

MacBook用のUSBハブとして、HDMI、USB Type-A、有線LAN(RJ-45)、SD/microSD、給電USB Type-Cを具えたものが製品化されています。例のひとつを次に示します。

https://www.amazon.co.jp/dp/B075FW7H5J