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 からインストールすることができますが、公式のサポートはありません。
インストール
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
を使って切り替えることができます:
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-7-openjdk (default) java-8-openjdk/jre
(default) は java-7-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 を使ってアプリケーションを起動したい場合 (例えば jre7 と jre8 の両方がインストールされている場合)、bash スクリプトでアプリケーションをラッピングして Java のデフォルトの PATH を変更することができます。例えば、デフォルトのバージョンが jre7 で、jre8 を使いたい場合:
#!/bin/sh export PATH=/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH exec /path/to/application "$@"
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 や 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 の記事の指示に従って下さい。
他のウィンドウマネージャになりすます
suckless.org の wmname を使うことで JVM に他のウィンドウマネージャを動かしていると信じこませることが可能です。これによって Awesome, Dwm, Ratpoison などのウィンドウマネージャで起こる Java の GUI のレンダリング問題が解決する可能性があります。
$ wmname LG3D
(wmname コマンドを実行した後、アプリケーションを再起動してください。)
これが機能するのは JVM にはハードコードされた既知の、ノンリペアレントウィンドウマネージャのリストが含まれているためです。最大の皮肉として、Sun によって Java で書かれたノンリペアレントウィンドウマネージャである LG3D
になりすますことを好むユーザーもいます。
フォントが読みにくい
下の #フォントレンダリングを改善する で書かれている方法でも、フォントによっては読みやすくならないことがあります。このようなときは、使用している MS フォントを変えてみて下さい。ttf-ms-fontsAUR パッケージをインストールしてください。
特定のアプリケーションでテキストが表示されない
特定のアプリケーションでテキストが完全に表示されない場合は FS#40871 で提案されているように #ヒントとテクニック のオプションを使うと直るかもしれません。
Too many levels of symbolic links
以下のようなエラーが表示される場合:
/usr/bin/java: line 2: /usr/lib/jvm/default/bin/java: Too many levels of symbolic links /usr/bin/java: line 2: exec: /usr/lib/jvm/default/bin/java: cannot execute: Too many levels of symbolic links
デフォルトの Java 環境を修正することで問題が解決するはずです。[1] も見て下さい。
JavaFX アプリケーションのデバッグ時にシステムがフリーズする
JavaFX アプリケーションをデバッグする際にシステムがフリーズする場合、JVM のオプション -Dsun.awt.disablegrab=true
を使ってみてください。
詳しくは https://bugs.java.com/view_bug.do?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] を参照。
ヒントとテクニック
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 プログラムが正しく描画されないことがあります。