torutkのブログ

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

Fedora 17にOracle JDK7u9およびNetBeans 7.3 beta2をインストール

Fedora 17には、OpenJDK 1.7.0が標準搭載されています。Fedora 17のアップデートをすると、現時点ではUpdate9が入ります。

ただし、Oracle JDKと違ってJavaFXは含まれていないので、JavaFXアプリケーションを作成するには、Oracle JDKを入れる必要があります。

そこで、Fedora 17に、Oracle JDK7 u9をインストールし、合わせてNetBeans 7.3 beta2をインストールし、パス設定、フォント設定をします。

OpenJDK 1.7.0について

Fedora 17に標準搭載されているOpenJDK 1.7.0のRPMパッケージとバージョン詳細情報は次のようになっています。

~$ rpm -qa|grep openjdk
java-1.7.0-openjdk-devel-1.7.0.9-2.3.3.fc17.1.x86_64
java-1.7.0-openjdk-1.7.0.9-2.3.3.fc17.1.x86_64

~$ java -version
java version "1.7.0_09-icedtea"
OpenJDK Runtime Environment (fedora-2.3.3.fc17.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

OpenJDKのインストール先は、

になります。

OpenJDKの日本語フォントをFedora 17で設定する

デフォルトでは日本語が化けるので、設定を修正します。詳しくは以前の日記(以下)を参照ください。

Oracle JDK7のインストール

Oracleのサイトから、Java SE Downloadsページ(次のURL)に行き、Oracle JDKをダウンロードします。RPM形式が提供されているので、こちらを利用します。

ダウンロードするファイルは次です(64bit版のとき)。

インストールは次のディレクトリに行われます。

/usr/java
  +-- jdk1.7.0_09
  |     +-- bin
  |     +-- jre
  |     |     +-- lib
  |     +-- lib
  :     :
  +-- default     --> latestへのシンボリックリンク
  +-- latest      --> jdk1.7.0_09へのシンボリックリンク
OpenJDKとOracle JDKの切り替え

OpenJDKがインストールされていると、/usr/bin/の下にjava, javacなどのコマンドがシンボリックリンクとして生成されます。これは、alternativesという機能を使って制御されるもので、例えば、javaコマンドについては次のような設定になっています。

そこで、Oracle JDKをインストール後、OpenJDKではなくOracle JDKを動かすようにするには、次の3つが考えられます。

  1. OpenJDKのアンインストール
  2. /usr/binより先に/usr/java/jdk1.7.0_09/bin などへ環境変数PATHを設定
  3. alternativesをOracle JDK用に設定

1.は、CentOSの標準パッケージでOpenJDKに依存しているものがあるとアンインストールできないので、実現性は厳しいと思われます。
2.は、比較的制御が容易ですが、ユーザーごとに環境変数設定をすると漏れるケースがあり、問題発生時の切り分けが手間になりそうです。
3.は、alternativesの動作・設定を理解する必要がありますが、一番素直な方法です。

alternativesでOracle JDK用の設定をしてみる

alternativesについては、以前本日記で取り上げたことがあります。

まずは、Oracle JDKに含まれる実行コマンドをalternativesに設定します。alternativesの設定・使い方は以前の日記を参照いただくとして、以下のスクリプトOracle JDK7u9用のalternatvie設定を記述しました。

#!/bin/bash
#
# Setting alternatives for Oracle JDK7u9
#
JAVA_BASE=/usr/java/jdk1.7.0_09
JDK_BIN=$JAVA_BASE/bin
JRE_BIN=$JAVA_BASE/jre/bin

# check root permission
if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_09/bin/java 170091 \
--slave /usr/bin/keytool keytool $JRE_BIN/keytool \
--slave /usr/bin/orbd orbd $JRE_BIN/orbd \
--slave /usr/bin/pack200 pack200 $JRE_BIN/pack200 \
--slave /usr/bin/rmid rmid $JRE_BIN/rmid \
--slave /usr/bin/rmiregistry rmiregistry $JRE_BIN/rmiregistry \
--slave /usr/bin/servertool servertool $JRE_BIN/servertool \
--slave /usr/bin/tnameserv tnameserv $JRE_BIN/tnameserve \
--slave /usr/bin/unpack200 unpack200 $JRE_BIN/unpack200

alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_09/bin/javac 170091 \
--slave /usr/bin/appletviewer appletviewer $JDK_BIN/appletviewer \
--slave /usr/bin/apt apt $JDK_BIN/apt \
--slave /usr/bin/extcheck extcheck $JDK_BIN/extcheck \
--slave /usr/bin/idlj idlj $JDK_BIN/idlj \
--slave /usr/bin/jar jar $JDK_BIN/jar \
--slave /usr/bin/jarsigner jarsigner $JDK_BIN/jarsigner \
--slave /usr/bin/javadoc javadoc $JDK_BIN/javadoc \
--slave /usr/bin/javafxpackager javafxpackager $JDK_BIN/javafxpackager \
--slave /usr/bin/javah javah $JDK_BIN/javah \
--slave /usr/bin/javap javap $JDK_BIN/javap \
--slave /usr/bin/javaws javaws $JDK_BIN/javaws \
--slave /usr/bin/jcmd jcmd $JDK_BIN/jcmd \
--slave /usr/bin/jconsole jconsole $JDK_BIN/jconsole \
--slave /usr/bin/jcontrol jcontrol $JDK_BIN/jcontrol \
--slave /usr/bin/jdb jdb $JDK_BIN/jdb \
--slave /usr/bin/jhat jhat $JDK_BIN/jhat \
--slave /usr/bin/jinfo jinfo $JDK_BIN/jinfo \
--slave /usr/bin/jmap jmap $JDK_BIN/jmap \
--slave /usr/bin/jps jps $JDK_BIN/jps \
--slave /usr/bin/jrunscript jrunscript $JDK_BIN/jrunscript \
--slave /usr/bin/jsadebugd jsadebugd $JDK_BIN/jsadebugd \
--slave /usr/bin/jstack jstack $JDK_BIN/jstack \
--slave /usr/bin/jstat jstat $JDK_BIN/jstat \
--slave /usr/bin/jstatd jstatd $JDK_BIN/jstatd \
--slave /usr/bin/jvisualvm jvisualvm $JDK_BIN/jvisualvm \
--slave /usr/bin/native2ascii native2ascii $JDK_BIN/native2ascii \
--slave /usr/bin/policytool policytool $JDK_BIN/policytool \
--slave /usr/bin/rmic rmic $JDK_BIN/rmic \
--slave /usr/bin/schemagen schemagen $JDK_BIN/schemagen \
--slave /usr/bin/serialver serialver $JDK_BIN/serialver \
--slave /usr/bin/servertool servertool $JDK_BIN/servertool \
--slave /usr/bin/wsgen wsgen $JDK_BIN/wsgen \
--slave /usr/bin/wsimport wsimport $JDK_BIN/wsimport \
--slave /usr/bin/xjc xjc $JDK_BIN/xjc

alternativesの優先度は、OpenJDKが17009なのでこれより大きな数値となるよう、170091としました。これなら、CentOSをupdateした際にOpenJDKのアップデートが増えて、OpenJDK側の優先度が17010となってもOracle JDKの方が高いままとなります。

このスクリプトを実行後、alternatviesの設定は次のようになります。

~$ alternatives --display java
java -ステータスは自動です。
リンクは現在 /usr/java/jdk1.7.0_09/bin/java を指しています。
/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java - 優先項目 17009
  :(略)
~$

また、manコマンドでOracle JDKのコマンドの使い方を見ることができるよう、~/.bash_profileなどにMANPATHを設定しておきます。

export MANPATH=$MANPATH:/usr/java/latest/man

(2013-12-10追記)Oracle JDK用のalternatives設定スクリプトをGistにアップしました。パスを/usr/java/latestに設定し優先度を200000にしたので、JDKをアップデートしてもalternativesは有効です。
https://gist.github.com/torutk/7882424

フォント設定

試行錯誤中