Java

提供: ArchWiki
2023年6月17日 (土) 22:15時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎インストール: 同期)
ナビゲーションに移動 検索に移動

関連記事

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 からインストールすることができますが、公式のサポートはありません。

インストール

ノート:
  • Arch Linux が公式にサポートしているのは OpenJDK 実装だけです。
  • インストール後、Java 環境をシェルに認識させる必要があります ($PATH 変数)。コマンドラインから /etc/profile を source するか、或いはデスクトップ環境から一度ログアウトしてログインし直すことで、シェルに認識させることができます。

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/default/usr/lib/jvm/default-runtime を変更したい場合は、必ず 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 に依存。
バージョン ヘッドレス JRE フル JRE JDK ドキュメント ソース
OpenJDK 20 jre-openjdk-headless jre-openjdk jdk-openjdk openjdk-doc openjdk-src
OpenJDK 17 jre17-openjdk-headless jre17-openjdk jdk17-openjdk openjdk17-doc openjdk17-src
OpenJDK 11 jre11-openjdk-headless jre11-openjdk jdk11-openjdk openjdk11-doc openjdk11-src
OpenJDK 8 jre8-openjdk-headless jre8-openjdk jdk8-openjdk openjdk8-doc openjdk8-src

OpenJDK GA — Oracle による最新 OpenJDK 一般公開リリースビルド。

https://jdk.java.net || java-openjdk-binAUR

OpenJDK EA — Oracle による開発版用の最新 OpenJDK 早期アクセスビルド。

https://jdk.java.net || java-openjdk-ea-binAUR

IcedTea-Web — Java Web Start と非推奨の Java ブラウザプラグイン。

https://icedtea.classpath.org/download/icedtea-web-docs/1.8/html/en/icedtea-web.html || icedtea-web

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 一般公開リリースビルド。

https://openjfx.io/ || java-openjfx-binAUR

OpenJFX EA — Gluon による開発版用の最新 OpenJFX 早期アクセスビルド。

https://openjfx.io/ || java-openjfx-ea-binAUR

他の実装

  • 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。
https://www.ibm.com/semeru-runtimes/downloads || jdk11-j9-binAUR
  • 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


ノート: OpenJDK の 32 ビット版は、64 ビット版のパッケージ名の前に bin32- を付けることで見つけることができます (例: bin32-jreAUR)。これらのパッケージは java32-runtime-commonAUR を使用します。java32-runtime-commonAUR パッケージは java-runtime-common として機能しますが、ツール名に接尾辞 32 が付きます (例: java32)。これは、32 ビット JDK パッケージによってのみ使用される java32-environment-commonAUR でも同じです。

開発ツール

統合開発環境については アプリケーション一覧/ユーティリティ#統合開発環境Java IDE サブセクションを見てください。

リバースエンジニアリングを困難にするには、proguardAUR などの難読化ツールを使用できます。

逆コンパイラ

  • CFR — Java 9、10、及びそれ以降の最近の機能をサポートしている Java 逆コンパイラ。
https://www.benf.org/other/cfr/ || cfr
  • FernflowerIntelliJ IDEA の一部として開発されている Java 解析逆コンパイラ。
https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-gitAUR
  • Quiltflower — Fernflower からフォークされた Java 逆コンパイラ。コードの品質を向上させることを目的としています。IntelliJ IDEA プラグインとしても利用できます。
https://github.com/QuiltMC/quiltflower || quiltflowerAUR
  • Krakatau — Java 逆コンパイラ、アセンブラ、逆アセンブラ。
https://github.com/Storyyeller/Krakatau || krakatau-gitAUR
  • Procyon decompiler — 実験的な Java 逆コンパイラ。ILSpy と Mono.Cecil の影響を受けています。
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler || procyon-decompiler
  • Java Decompiler (JD-Core) — 人気な Java 逆コンパイラ。GUI (JD-GUI を参照) を提供し、Java 1~10 をサポートしています。
https://java-decompiler.github.io/ || jd-core-javaAUR
  • Jadx — Android DEX から Java に逆コンパイルします。オプションの GUI 有り (Jadx-GUI を参照)。
https://github.com/skylot/jadx || jadx
  • JAD — メンテナンスされていない Java 逆コンパイラ (最後のリリースは 2006 年です)。
https://varaneckas.com/jad || jad

GUI フロントエンド

  • Bytecode Viewer — Java のリバースエンジニアリングスイート。逆コンパイラ、エディタ、そしてデバッガを含んでいます。CFR/Fernflower/Procyon のフロントエンドです。
https://bytecodeviewer.com || bytecode-viewerAUR
  • Recaf — 使いやすいモダンな Java バイトコードエディタ。Java プログラムの複雑さを抽象化します。CFR/Fernflower/Procyon のフロントエンドです。
https://www.coley.software/Recaf/ || recaf-binAUR
  • Java Decompiler (JD-GUI) — 人気な Java 逆コンパイラ。GUI を提供し、Java 1~10 をサポートしています。JD-Core のフロントエンドです。
https://java-decompiler.github.io/ || jd-guiAUR
  • Jadx-GUI — Android APK DEX から Java に逆コンパイルします。オプションの GUI 有り。Jadx のフロントエンドです。
https://github.com/skylot/jadx || jadx
  • Luyten — オープンソースの Java 逆コンパイラ GUI。Procyon のフロントエンドです。
https://github.com/deathmarine/Luyten || luytenAUR

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 をサポートするのに必要なパッケージの条件

ノート: 以下の情報は32ビットの Java パッケージである archlinux32-java にも同じく当てはまります。パッケージや実行ファイルの名前には 32 を含めてください。

このセクションは AUR に新しい JVM のパッケージを投稿し、Arch Linux の JVM の扱いかたにあわせて archlinux-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.orgwmname を使うことで 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 ランタイムを明示的に使用する全てのアプリケーションに適用されます。ただし独自の (内部の) ランタイムを持っていたり GUI やフォントレンダリングに独自の手法を使っているアプリケーションも存在するため、下に書かれていることが全て機能するとは保証できません。

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'
ノート: このオプションを有効にすると JetBrains IDE などのソフトウェアの UI がおかしくなって、ウィンドウやポップアップ、ツールバーが一部しか表示されなくなることがあります。

リペアレントしないウィンドウマネージャ

リペアレントしないウィンドウマネージャを使用する場合は .xinitrc で以下の環境変数を設定してください:

export _JAVA_AWT_WM_NONREPARENTING=1

上記の設定を行わないと Java プログラムが正しく描画されないことがあります。

参照