Java (日本語) - ArchWiki

# Java (日本語)

関連記事

- Java パッケージガイドライン

"Java は Sun Microsystems によって開発され1995年に Sun Microsystems の Java プラットフォームのコアコンポーネントとしてリリースされたプログラミング言語です。構文は C および C++ から多くを引き継いでいますが、オブジェクトモデルがシンプルで低水準の機能が削られています。基本的に Java のアプリケーションはコンピュータアーキテクチャに関係なく動く Java 仮想マシン (JVM) で動くバイトコードにコンパイルされます。" — Wikipedia

Arch Linux は公式でオープンソースの OpenJDK バージョン7と8をサポートしています。これらの JVM は全てインストールしても衝突せず、ヘルパースクリプト `archlinux-java` を使って切り替えることが可能です。他の Java 環境は AUR からインストールすることができますが公式のサポートはありません。

## インストール

公式リポジトリから以下のパッケージがインストールできます:

OpenJDK 7:

パッケージ名 | 中身
--- | ---
jre7-openjdk-headless | Java 実行環境 (JRE) グラフィカルツールなし - バージョン 7
jre7-openjdk | 完全な Java 実行環境 (JRE) - バージョン 7
jdk7-openjdk | Java 開発キット (JDK) - バージョン 7
openjdk7-doc | OpenJDK javadoc - バージョン 7
openjdk7-src | OpenJDK ソース - バージョン 7

OpenJDK 8:

パッケージ名 | 中身
--- | ---
jre8-openjdk-headless | Java 実行環境 (JRE) グラフィカルツールなし - バージョン 8
jre8-openjdk | 完全な Java 実行環境 (JRE) - バージョン 8
jdk8-openjdk | Java 開発キット (JDK) - バージョン 8
openjdk8-doc | OpenJDK javadoc - バージョン 8
openjdk8-src | OpenJDK ソース - バージョン 8

Note: JDK をインストールすると自動的に依存パッケージとして JRE がインストールされます。
Note: インストールした後、Java 環境をシェルに認識させる必要があります (`$PATH` 変数)。コマンドラインから `/etc/profile` を source するか、デスクトップ環境ならばログアウトとログインが必要です。

依存パッケージとして自動的にインストールされる java-runtime-common と java-environment-common という名前の2つの共通パッケージには環境ファイル `/etc/profile.d/jre.sh` が入っています。このファイルには全ての JVM 環境で共通の変数が含まれています。また、java-runtime-common パッケージにはデフォルトの Java 環境を表示したり変更することができるユーティリティスクリプト `archlinux-java` も付いています。このスクリプトは衝突しないように `/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}` にインストールされた Java 環境や Java ランタイムに `/usr/lib/jvm/default` や `/usr/lib/jvm/default-runtime` からリンクを設定します。さらに Java 環境セットによる全ての実行ファイルのために `/usr/bin` にリンクを作成・更新します。

Warning: ファイル `/etc/profile.d/jdk.sh` は現在どのパッケージにも入っていません。

ブラウザで Java を使うには (Java アプレットや Java Web Start)、icedtea-web をインストールしてください。詳しくは Browser Plugins (日本語)#Java (IcedTea) を見て下さい。

## パッケージの out-of-date

Arch Linux のパッケージのリリースにはパッケージがベースとしているプロプライエタリのバージョンへの言及が含まれていることがありますが、オープンソースプロジェクトには独自のバージョン規則があります:

- jre7-openjdk, jdk7-openjdk, jre7-openjdk-headless は IcedTea のバージョン (例: `2.4.3`) にあわせて out-of-date になります。Oracle のバージョン (例: `7.u45_2.4.3-1` の `u45`) は関係ありません。
- icedtea-web は IcedTea Web のバージョン (例: `1.4.1`) にあわせて out-of-date になります。IcedTea のバージョンは関係ありません。

## JVM の切り替え

ヘルパースクリプト `archlinux-java` を使って切り替えることができます:

    archlinux-java <COMMAND>

    COMMAND:
    	status		List installed Java environments and enabled one
    	get		Return the short name of the Java environment set as default
    	set <JAVA_ENV>	Force <JAVA_ENV> as default
    	unset		Unset current default Java environment
    	fix		Fix an invalid/broken default Java environment configuration

### インストールされている 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 7" と "OpenJDK 8" がまず初めに使われます。AUR の非公式パッケージはその後です):

    # archlinux-java fix

### 旧ワンタイム設定

以前は、`JAVA_HOME` 環境変数を設定して、Java インストールを使用するのに java-common[broken link: replaced by java-runtime-common] パッケージを使用する必要がありました。シンボリックリンクの数を減らして FS#41883 を修正するために、java-runtime-common は代わりに `PATH` を設定するので、ユーザーが `JAVA_HOME` に設定したものは全て上書きされます。

## `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 を依存パッケージとして宣言することができます

## AUR のサポートされていない JVM

Warning: AUR のパッケージは `archlinux-java` をサポートしていたりしていなかったりします。

### Java SE

Oracle による JRE と JDK の実装は AUR から利用できます: jre と jdk。

#### Java SE 6/7

AUR には旧バージョンである jre6/jre6-compat[broken link: package not found]/jre7 と jdk6/jdk6-compat[broken link: package not found]/jdk7 が含まれています。

### Oracle JRockit

JRockit は Oracle による Java の JIT バージョンであり、AUR の jrockit からインストールできます。

### VMkit

VMkit は JIT 仮想マシンのための LLVM ベースのフレームワークです。J3 は VMkit を動作させる JVM です。ウェブページはここにあります: vmkit。J3 は GNU classpath ライブラリに依存していますが、Apache のクラスパスライブラリを使うことも可能です。

### Parrot VM

Parrot は VM であり、異なる2つの方法によって実験的に Java をサポート しています: Java VM バイトコード翻訳機 もしくは Parrot VM のための Java コンパイラ。parrot は公式リポジトリからインストールでき、AUR には parrot-git があります。

## トラブルシューティング

### MySQL

JDBC ドライバーは URL のポートを使ってデータベースへの接続を確立するため、同じホストで動作していたとしても"リモート"とされます (すなわち MySQL はデフォルト設定のようにポートを開きません)。そのため、JDBC と MySQL を使うには MySQL のリモートアクセスを有効にする必要があります。MySQL の記事の指示に従って下さい。

### 他のウィンドウマネージャになりすます

suckless.org の wmname を使うことで JVM に他のウィンドウマネージャを動かしていると信じこませることが可能です。これによって Awesome や Dwm などのウィンドウマネージャで起こる Java の GUI のレンダリング問題が解決する可能性があります。

    $ wmname LG3D

(wmname コマンドを実行した後、アプリケーションを再起動してください。)

これが機能するのは JVM にはハードコードされた既知の、ノンリペアレントウィンドウマネージャのリストが含まれているためです。最大の皮肉として、Sun によって Java で書かれたノンリペアレントウィンドウマネージャである `LG3D` になりすますことを好むユーザーもいます。

### フォントが読みにくい

下の #フォントレンダリングを改善する で書かれている方法でも、フォントによっては読みやすくならないことがあります。このようなときは、使用している MS フォントを変えてみて下さい。AUR から ttf-ms-fonts をインストールしてください。

### 特定のアプリケーションでテキストが表示されない

特定のアプリケーションでテキストが完全に表示されない場合は FS#40871 で提案されているように #Tips and tricks のオプションを使うと直るかもしれません。

### 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] も見て下さい。

## Tips and tricks

Note: このセクションで提案されていることは、インストールされている (外部の) 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 実装のどちらもがフォントのアンチエイリアスを不適当に実装していることが知られています。次のオプションを使うことでこれを修正することが可能です: `awt.useSystemAAFontSettings=on`, `swing.aatext=true`

詳しい情報は Java Runtime Environment Fonts (日本語) を見て下さい。

### GTK のルックアンドフィール

Java プログラムの見た目が酷い場合、swing コンポーネントのデフォルトのルックアンドフィールを設定することができます: `swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel`.

頑固な Java プログラムはクロスプラットフォームの Metal ルックアンドフィールを使用し続けることがあります。そのような場合には以下のプロパティを設定することで GTK のルックアンドフィールを使うように強制することが可能です: `swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel`。

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

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

    export _JAVA_AWT_WM_NONREPARENTING=1

Category:

- Programming language (日本語)