Java
Wikipedia より:
- Java は Sun Microsystems によって開発され1995年に Sun Microsystems の Java プラットフォームのコアコンポーネントとしてリリースされたプログラミング言語です。構文は C および C++ から多くを引き継いでいますが、オブジェクトモデルがシンプルで低水準の機能が削られています。基本的に Java のアプリケーションはコンピュータアーキテクチャに関係なく動く Java 仮想マシン (JVM) で動くバイトコードにコンパイルされます。
Arch Linux は、オープンソースの OpenJDK バージョン 8、11、17、そして 20 を公式にサポートしています。これらの JVM は全てインストールしても衝突せず、ヘルパースクリプト archlinux-java
を使って切り替えることが可能です。他の Java 環境はいくつか AUR からインストールすることができますが、公式のサポートはありません。
目次
- 1 インストール
- 2 JVM の切り替え
- 3 archlinux-java をサポートするために必要なパッケージの前提条件
- 4 トラブルシューティング
- 4.1 MySQL
- 4.2 IntelliJ IDEA
- 4.3 他のウィンドウマネージャになりすます
- 4.4 フォントが読みにくい
- 4.5 一部のアプリケーションでテキストが表示されない
- 4.6 灰色のウィンドウ、ウィンドウマネージャでアプリがリサイズされない、メニューがすぐに閉じる
- 4.7 JavaFX アプリケーションのデバッグ時にシステムがフリーズする
- 4.8 JavaFX の MediaPlayer コンストラクタが例外を投げる
- 4.9 Java アプリケーションで外部リンクを開けない
- 4.10 QuantumRenderer の初期化でエラー: no suitable pipeline found
- 5 ヒントとテクニック
- 6 参照
インストール
2つの 共通 パッケージがそれぞれ依存パッケージとしてインストールされます: java-runtime-common (全ての Java Runtime Environment に共通のファイルが含まれています) と java-environment-common (全ての Java Development Kit に共通のファイルが含まれています) です。提供される環境ファイル /etc/profile.d/jre.sh
は、シンボリックリンクによって参照されている /usr/lib/jvm/default/bin
を指しており、このシンボリックリンクは archlinux-java
ヘルパースクリプトによって設定されます。
これは、/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}
内のデフォルトの作業 Java 環境や、/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}/jre
内の Java ランタイムを表示したり指定したりするために使用されます。
Java 環境のほとんどの実行ファイルは、/usr/bin/
内のダイレクトリンクによって提供されます。一方、その他は $PATH
でアクセスできます。/etc/profile.d/jdk.sh
スクリプトは、もはやどのパッケージからも提供されません。
OpenJDK
OpenJDK は、Java Platform, Standard Edition (Java SE) のオープンソースな実装であり、公式リファレンス実装として指定されています。OpenJDK ビルドには、Adoptium (以前は AdoptOpenJDK として知られていました) や Amazon Corretto などの複数のディストリビューターが存在しています。Arch Linux の OpenJDK パッケージは上流の OpenJDK ソースコードからビルドされています。
- ヘッドレス JRE
- 最小限の Java 実行環境 - 非 GUI な Java プログラムを実行するために必要。
- フル JRE
- 完全な Java 実行環境 - Java の GUI プログラムを実行するために必要。ヘッドレス JRE に依存。
- JDK
- Java Development Kit - Java で開発するために必要。フル JRE に依存。
OpenJDK GA — Oracle による最新 OpenJDK 一般公開リリースビルド。
OpenJDK EA — Oracle による開発版用の最新 OpenJDK 早期アクセスビルド。
IcedTea-Web — Java Web Start と非推奨の Java ブラウザプラグイン。
OpenJFX
OpenJFX は、JavaFX のオープンソースな実装です。Oracle JDK を使用している場合は、このパッケージをインストールする必要はありません。このパッケージは、Java のオープンソース実装 (OpenJDK プロジェクト) やその派生版のユーザのみを対象としています。
バージョン | 実行環境及び開発環境 | ドキュメント | ソース |
---|---|---|---|
OpenJFX 20 | java-openjfx | java-openjfx-doc | java-openjfx-src |
OpenJFX 17 | java17-openjfx | java17-openjfx-doc | java17-openjfx-src |
OpenJFX 11 | java11-openjfxAUR | java11-openjfx-docAUR | java11-openjfx-srcAUR |
OpenJFX 8 | java8-openjfxAUR | java8-openjfx-docAUR | java8-openjfx-srcAUR |
OpenJFX GA — Gluon による最新 OpenJFX 一般公開リリースビルド。
OpenJFX EA — Gluon による開発版用の最新 OpenJFX 早期アクセスビルド。
他の実装
- Oracle JDK — Oracle の OpenJDK 商用ライセンスビルド。一部のバージョンは手動ダウンロードでしか利用できないことに注意してください。手動ダウンロードでは、OTN 契約に署名し、Oracle アカウントを作成する必要があります。
- https://www.oracle.com/java/technologies/downloads/ ||
- JRE: jreAUR jre-ltsAUR jre11AUR jre8AUR jre7AUR
- JDK: jdkAUR jdk-ltsAUR jdk11AUR jdk8AUR jdk7AUR
- Eclipse Adoptium/Temurin — Eclipse の JRE/JDK 実装。Hotspot JVM (以前は AdoptOpenJDK) をベースとしています。この JRE は、Eclipse Temurin として知られています。
- https://adoptium.net/ || jdk-temurinAUR jdk17-temurinAUR jdk11-temurinAUR
- OpenJ9 — IBM によって提供されている、J9 JVM ベースの、Eclipse の JRE/JDK 実装。
- https://www.eclipse.org/openj9/ || jdk-openj9-binAUR jdk17-openj9-binAUR jdk11-openj9-binAUR jdk8-openj9-binAUR
- IBM Certified — IBM Semeru Runtime Certified Edition。
- IBM J9 — IBM の JRE 実装。OpenJ9 のコードを使用。
- https://www.ibm.com/support/pages/java-sdk-downloads || jdk8-j9-binAUR jdk7-j9-binAUR jdk7r1-j9-binAUR
- Azul JDK — Azul の JDK 実装。OpenJDK の Azul Zulu ビルドはオープンソースですが、OpenJDK の Azul Zulu Prime ビルドは開発と評価用では無料の商用製品であることに注意してください。
- https://www.azul.com/downloads/ ||
- Zulu: zulu-8-binAUR zulu-10-binAUR zulu-11-binAUR zulu-12-binAUR zulu-13-binAUR zulu-14-binAUR zulu-15-binAUR zulu-16-binAUR zulu-17-binAUR zulu-18-binAUR zulu-19-binAUR zulu-20-binAUR
- Zulu Prime: jdk17-zulu-prime-binAUR
開発ツール
統合開発環境については アプリケーション一覧/ユーティリティ#統合開発環境 や Java IDE サブセクションを見てください。
リバースエンジニアリングを困難にするには、proguardAUR などの難読化ツールを使用できます。
逆コンパイラ
- CFR — Java 9、10、及びそれ以降の最近の機能をサポートしている Java 逆コンパイラ。
- Fernflower — IntelliJ IDEA の一部として開発されている Java 解析逆コンパイラ。
- https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-gitAUR
- Quiltflower — Fernflower からフォークされた Java 逆コンパイラ。コードの品質を向上させることを目的としています。IntelliJ IDEA プラグインとしても利用できます。
- Krakatau — Java 逆コンパイラ、アセンブラ、逆アセンブラ。
- Procyon decompiler — 実験的な Java 逆コンパイラ。ILSpy と Mono.Cecil の影響を受けています。
- Java Decompiler (JD-Core) — 人気な Java 逆コンパイラ。GUI (JD-GUI を参照) を提供し、Java 1~10 をサポートしています。
- Jadx — Android DEX から Java に逆コンパイルします。オプションの GUI 有り (Jadx-GUI を参照)。
- JAD — メンテナンスされていない Java 逆コンパイラ (最後のリリースは 2006 年です)。
GUI フロントエンド
- Bytecode Viewer — Java のリバースエンジニアリングスイート。逆コンパイラ、エディタ、そしてデバッガを含んでいます。CFR/Fernflower/Procyon のフロントエンドです。
- Recaf — 使いやすいモダンな Java バイトコードエディタ。Java プログラムの複雑さを抽象化します。CFR/Fernflower/Procyon のフロントエンドです。
- Java Decompiler (JD-GUI) — 人気な Java 逆コンパイラ。GUI を提供し、Java 1~10 をサポートしています。JD-Core のフロントエンドです。
- Jadx-GUI — Android APK DEX から Java に逆コンパイルします。オプションの GUI 有り。Jadx のフロントエンドです。
- Luyten — オープンソースの Java 逆コンパイラ GUI。Procyon のフロントエンドです。
JVM の切り替え
ヘルパースクリプト archlinux-java
(java-runtime-common パッケージ) は、以下のような機能を提供します:
archlinux-java <COMMAND> COMMAND: status インストールされている Java 環境と有効になっている環境を表示 get デフォルトに設定されている Java 環境を返す set <JAVA_ENV> <JAVA_ENV> をデフォルトに設定 unset デフォルトの Java 環境の設定を解除 fix 不正な Java 環境の設定を修正
インストールされている Java 互換環境を表示
$ archlinux-java status
例:
$ archlinux-java status
Available Java environments: java-11-openjdk (default) java-8-openjdk/jre
(default) は java-11-openjdk
がデフォルトに設定されていることを示しています。java
やその他のバイナリの呼び出しはこの Java インストールに基づきます。また、上の出力では OpenJDK 8 の JRE しかインストールされていないことに注意してください。
デフォルトの Java 環境を変更
# archlinux-java set <JAVA_ENV_NAME>
例:
# archlinux-java set java-8-openjdk/jre
archlinux-java
は、存在しない Java 環境を設定することはできません。前の例では、jre8-openjdk はインストールされていますが jdk8-openjdk はインストールされていないため、java-8-openjdk
を設定しようとしても失敗します:
# archlinux-java set java-8-openjdk
'/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path
デフォルトの Java 環境の設定を解除
パッケージが設定を管理するため、Java 環境の設定を解除する必要はないはずです。それでも設定を解除したいときは、unset
コマンドを使って下さい:
# archlinux-java unset
デフォルトの Java 環境を修正
存在しない Java 環境のリンクが設定されている場合、archlinux-java fix
コマンドを呼び出すとリンクの修正が行われます。デフォルトの Java 環境が設定されていないときは、インストールされている Java 環境を探して設定を行います (ここでは、公式でサポートされているパッケージ "OpenJDK 8" がまず初めに使われます。他のインストール環境はその後です):
# archlinux-java fix
デフォルトでないバージョンの Java を使ってアプリケーションを起動
デフォルトのバージョン以外の Java を使ってアプリケーションを起動したい場合 (例えばバージョン 18 と 11 の両方がインストールされている場合)、bash スクリプトでアプリケーションをラッピングして Java のデフォルトの PATH を変更することができます。例えば、デフォルトが java 18 で、java 11 を使いたい場合:
#!/bin/sh export PATH="/usr/lib/jvm/java-11-openjdk/bin/:$PATH" exec /path/to/application "$@"
Systemd サービスの場合、ドロップインファイル で JAVA_HOME
を環境変数に追加することで可能です:
/etc/systemd/system/unit.d/override.conf
[Service] Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
archlinux-java をサポートするために必要なパッケージの前提条件
このセクションは AUR に新しい JVM のパッケージを投稿し、Arch Linux の JVM の扱いかたにあわせて archlinux-java
を使用したいパッケージ作成者を対象にしています。パッケージは以下の条件を満たす必要があります:
- 全てのファイルは
/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}
以下に配置すること - java-runtime-common と java-environment-common が提供するシンボリックリンクに対応する全ての実行ファイルが、該当するパッケージにおいて利用可能であること。(訳注: 例えば、java-runtime-common は
/usr/bin/java
シンボリックリンクを提供していますが、あなたの作成したパッケージにもこれに対応する実行ファイルが含まれていなければなりません。その他のシンボリックリンクにおいても同様です。) - シンボリックリンクがまだ java-runtime-common と java-environment-common に存在しない場合にのみ、
/usr/bin
から実行ファイルへのシンボリックリンクを同梱すること。 - man ページの末尾に
-${VENDOR_NAME}${JAVA_MAJOR_VERSION}
を付けて、衝突しないようにすること (jre8-openjdk のファイルリストを見れば-openjdk8
を付ける man ページがわかります) - 他の JDK、
java-runtime
、java-runtime-headless
、java-environment
を conflicts や replaces として宣言しないこと。 - install 関数で
archlinux-java
スクリプトを使って、他の有効な Java 環境が設定されていない場合に 自身の Java 環境をデフォルトに設定すること (つまり、パッケージは強制的にデフォルトとして設定するべきではありません)。サンプルは公式にサポートされている Java 環境のパッケージのソースを参照。
他の注意事項:
- 任意の Java 環境を必要とするパッケージは、通常通り
java-runtime
、java-runtime-headless
、java-environment
のどれかを依存関係として宣言すること。 - 特定の Java ベンダ を必要とするパッケージは、それに対応するパッケージを依存関係として宣言すること。
- OpenJDK パッケージでは、
provides="java-runtime-openjdk=${pkgver}"
などが宣言されるようになっています。これにより、サードパーティのパッケージではバージョンを指定せずに OpenJDK を依存関係として宣言できるようになっています。
トラブルシューティング
MySQL
JDBC ドライバーは URL のポートを使ってデータベースへの接続を確立するため、同じホストで動作していたとしても"リモート"とされます (すなわち MySQL はデフォルト設定のようにポートを開きません)。そのため、JDBC と MySQL を使うには MySQL のリモートアクセスを有効にする必要があります。MariaDB#リモートアクセスを有効にする の指示に従って下さい。
IntelliJ IDEA
IntelliJ IDEA がシステムの JAVA SDK のパスと共に The selected directory is not a valid home for JDK
と出力する場合、他の JDK パッケージをインストールして、そのパッケージを IDEA の JDK として選択する必要があるかもしれません。
他のウィンドウマネージャになりすます
suckless.org の wmname を使うことで、他のウィンドウマネージャを動かしていると JVM に信じ込ませることができます。これによって、Awesome や Dwm、Ratpoison のようなウィンドウマネージャで発生する Java の GUI レンダリング問題を解決できる場合があります。これがうまく行く理由は、JVM にはリペアレンティング型でない既知のウィンドウマネージャのハードコードされたリストが含まれているからです。皮肉なことに、一部のユーザは、Sun によって Java で記述されたリペアレンティング型でないウィンドウマネージャである LG3D
になりすますことを好みます。"compiz" や "Metacity"、"LG3D" に設定してみてください:
$ wmname ウィンドウマネージャ名
wmname コマンドを実行した後、問題が発生しているアプリケーションを再起動する必要があります。
あるいは、javaagent JavaMatePatch を使うこともできます。これは、MATE においてウィンドウマネージャ名を設定し、Java Swing アプリがフルスクリーン時に不適切な挙動を行うバグを解決するために作成されました。使用するには、-javaagent:JavaMatePatch-1.0.0-SNAPSHOT.jar=ウィンドウマネージャ名
を java オプションに追加してください。
フォントが読みにくい
下の #フォントレンダリングを改善する で書かれている方法でも、フォントによっては読みやすくならないことがあります。このようなときは、使用している MS フォントを変えてみて下さい。ttf-ms-fontsAUR パッケージをインストールしてください。
一部のアプリケーションでテキストが表示されない
一部のアプリケーションでテキストが全く表示されない場合は FS#40871 で提案されているように #ヒントとテクニック のオプションを使うと直るかもしれません。
灰色のウィンドウ、ウィンドウマネージャでアプリがリサイズされない、メニューがすぐに閉じる
標準の Java GUI ツールキットには、「リペアレンティング型でない」ウィンドウマネージャのハードコードされたリストがあります。そのリストに無いウィンドウマネージャを使用すると、一部の Java アプリケーションで問題が発生する可能性があります。最も一般的な問題の1つが、Java アプリケーションが GUI をレンダリングせずにのっぺりとした灰色のボックスとして表示される「灰色のウィンドウ」問題です。クリックでメニューを開いてもすぐに閉じてしまう問題も発生することがあります。
解決に役立つ方法がいくつか存在します:
- #他のウィンドウマネージャになりすます を参照してください。
- jre8-openjdk の場合、
_JAVA_AWT_WM_NONREPARENTING=1
環境変数を設定してください。 - その後のバージョンでは、
AWT_TOOLKIT=MToolkit
環境変数を設定してください。 - xmonad の場合、SetWMName を使用してください。ただし、
XMonad.Hooks.EwmhDesktops
を使うと効果がキャンセルされてしまうことがあります。その場合、>> setWMName "LG3D"
をLogHook
に追加すると解決できる場合があります。
詳細は [1] を参照してください。
JavaFX アプリケーションのデバッグ時にシステムがフリーズする
JavaFX アプリケーションをデバッグする際にシステムがフリーズする場合、JVM のオプション -Dsun.awt.disablegrab=true
を使ってみてください。
https://bugs.java.com/bugdatabase/view_bug?bug_id=6714678 を参照。
JavaFX の MediaPlayer コンストラクタが例外を投げる
JavaFX のサウンドモジュールから MediaPlayer クラスのインスタンスを作成しようとしたときに以下の例外が発生することがあります (Oracle JDK と OpenJDK の両方で発生):
... (i.e. FXMLLoader construction exceptions) ... Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511) at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414) at <constructor call> ...
原因は JavaFX が Arch Linux のリポジトリに含まれている新しい ffmpeg と互換性がないためです。
解決方法は ffmpeg-compat-55AUR をインストールすることです。
参照: https://www.reddit.com/r/archlinux/comments/70o8o6/using_a_javafx_mediaplayer_in_arch/
Java アプリケーションで外部リンクを開けない
Java アプリケーションからウェブブラウザなどのリンクを開けない場合、gvfs をインストールしてください。Desktop.Action.BROWSE メソッドが必要とします。[2] を参照。
QuantumRenderer の初期化でエラー: no suitable pipeline found
考えられる問題と解決策:
- GTK2 が無い。gtk2 をインストールしてください。
- OpenJFX が無い。java-openjfx をインストールしてください。
ヒントとテクニック
Java アプリケーションのほとんどは Java ランタイムの前に変数を設定することで挙動をコントロールすることができます。フォーラムの投稿より、変数を設定するには ~/.bashrc
(もしくは全てのユーザーに適用するには /etc/profile.d/jre.sh
) に次の行を追加してください:
export _JAVA_OPTIONS="-D<option 1> -D<option 2>..."
例えば、システムのアンチエイリアスがされたフォントを使用して swing に GTK のルックアンドフィールを使わせるには:
export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
フォントレンダリングを改善する
クローズドソースとオープンソースの Java 実装のどちらもがフォントのアンチエイリアスを不適当に実装していることが知られています。次のオプションを使うことでこれを修正することが可能です: -Dawt.useSystemAAFontSettings=on
, -Dswing.aatext=true
詳しい情報は Java 実行環境のフォントを見てください。
コマンドラインの 'Picked up _JAVA_OPTIONS' メッセージを消す
_JAVA_OPTIONS
環境変数を設定すると java (openjdk) から標準出力に次のようなメッセージが書き出されます: 'Picked up _JAVA_OPTIONS=...'。ターミナルにメッセージを表示しないようにするには、シェルのスタートアップファイルから環境変数を消去して、以下のように java のエイリアスを作成してコマンドライン引数を使ってオプションを指定するようにしてください:
_SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS" unset _JAVA_OPTIONS alias java='java "$_SILENT_JAVA_OPTIONS"'
GTK のルックアンドフィール
Java プログラムの見た目が酷い場合、swing コンポーネントのデフォルトのルックアンドフィールを設定することができます: swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
.
頑固な Java プログラムはクロスプラットフォームの Metal ルックアンドフィールを使用し続けることがあります。そのような場合には以下のプロパティを設定することで GTK のルックアンドフィールを使うように強制することが可能です: swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
。
GTK3 のサポート
バージョン 9 以前の Java では、GTK のルックアンドフィールが GTK2 に対してリンクされていますが、新しいデスクトップアプリケーションは GTK3 を使用します。GTK3 アプリに GUI の Java プラグインが存在すると、Java の GUI を開いたときにアプリがクラッシュします。同じプロセスで GTK2 と GTK3 を混ぜることはできません。例えば Libreoffice 5.0 などがこれに該当します。
Java 9 から、GTK のルックアンドフィールは GTK のバージョン 2
, 2.2
, 3
で動作するようになっており、デフォルトは GTK2 になっています。以下のプロパティを設定することで上書きすることができます:
jdk.gtk.version=3
2D のパフォーマンスの向上
OpenGL ベースのハードウェアアクセラレーションパイプラインに切り替えることで 2D の性能が改善します:
export _JAVA_OPTIONS='-Dsun.java2d.opengl=true'
リペアレントしないウィンドウマネージャ
リペアレントしないウィンドウマネージャを使用する場合は .xinitrc
で以下の環境変数を設定してください:
export _JAVA_AWT_WM_NONREPARENTING=1
上記の設定を行わないと Java プログラムが正しく描画されないことがあります。