A Way of Code

興味の赴くままに書き綴っていきます。

MacでOracle JDK 7 (Java 7) を試す

Oracle JDKのMac版がリリースされたので、早速試してみました。

インストール

AppleJDKがインストールされている場合は、Oracle JDKと共存できるのでそのままで結構です。

ダウンロード先はこちら:

ダウンロードトップページ
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Oracle Java SE 7u4
http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html


上記ページにある"jdk-7u4-macosx-x64.dmg"をダウンロードします。
f:id:toggtc:20120428104300j:plain


"jdk-7u4-macosx-x64.dmg"というファイルをマウントすると、"JDK 7 Update 04.pkg"というインストーラーパッケージが出てきます。
f:id:toggtc:20120428104508j:plain

このpkgファイルをダブルクリックすればインストーラーが起動するので、そのままインストールします。
f:id:toggtc:20120428104610j:plain


f:id:toggtc:20120428104845j:plain
「次のステップ」というリンクをクリックすると、後述するセットアップの作業手順を示したページが表示されます。


インストールが終わったので、ここで一旦、パスが通っているJavaのバージョンを確認しておきます。

$java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3646)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)

バージョンが1.6(AppleのJDK)になっているので、勝手にパスが書き換わる、ということは無いようです。

セットアップ

インストールが完了したら、次は以下のページに従ってセットアップを行います。
http://www.oracle.com/technetwork/java/javase/downloads/jdk-for-mac-readme-1564562.html

まず、/Applications/Utilities/にある"Java Preferences"を開きます。
次に、"Java 7"の項目を一番上にドラッグ&ドロップして移動します。
f:id:toggtc:20120428105029j:plain

そして、Javaのバージョンを確認します。

$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

これでJava 7が使えるようになりました。

セットアップ(Eclipse編)

Eclipse側もJDK 7にしてしまいましょう。
注意点は、「MacOS X VM」を選択することです。

1)
[Eclipse] → [環境設定]から"Preferences"ウィンドウを開く
Java→Installed JREs を選択して、Addボタンを押す。
f:id:toggtc:20120428105553j:plain

2)
MacOSX VM を選択して、次へ
f:id:toggtc:20120428105849j:plain

3)
JRE home: /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home
JRE name: 任意の名前(ここではJava SE 7)
を設定して、Finish。
f:id:toggtc:20120428110217j:plain

サンプルコード

サンプルを動かしてみましょう。

javaのバージョン確認

// 1.  Javaのバージョンを確認する
System.out.println(System.getProperty("java.version")); // => 1.7.0_04

実行環境のJavaバージョンは、"java.version"プロパティで確認できます。
ちゃんと1.7.0_04になりました。

Pathsクラスの確認

Macだと、Pathsクラスの実装クラスは"sun.nio.fs.UnixPath"でした。

// 2. Pathsクラスの実装クラスを確認する
String className = Paths.get("").getClass().toString();
System.out.println("java.ni.file.Path=" + className); // =>java.ni.file.Path=class sun.nio.fs.UnixPath

WatchServiceでディレクトリをモニタリングしてみる

Java 7で追加されたNIO2のWatchServiceを使ってみます。
モニタリング先のディレクトリはテキトーに/private/tmp/にしています。

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Java7Test {
	public static void main(String[] args) {
		// 1.  Javaのバージョンを確認する
		System.out.println(System.getProperty("java.version")); // => 1.7.0_04

		// 2. Pathsクラスの実装クラスを確認する
		String className = Paths.get("").getClass().toString();
		System.out.println("java.ni.file.Path=" + className); // =>java.ni.file.Path=class.sun.nio.fs.UnixPath

		// 3. WatchServiceを使ってディレクトリをモニタリングしてみる
		try (WatchService service = FileSystems.getDefault().newWatchService()) {
			final Path dir = Paths.get("/private/tmp/");

			dir.register(service, 
					StandardWatchEventKinds.ENTRY_CREATE,
					StandardWatchEventKinds.ENTRY_DELETE,
					StandardWatchEventKinds.ENTRY_MODIFY
					);
			
			WatchKey key = service.take();
			for (final WatchEvent<?> event : key.pollEvents()) {
				System.out.println(event.kind().toString() + ":" + event.context().toString());
			}
		} catch (IOException | InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

/private/tmp/ディレクトリにファイルを追加したり編集したりすると、コンソールに結果が表示されます。
サンプルを実行して、

$ touch /private/tmp/hello.txt

とすると、"ENTRY_CREATE:hello.txt"と表示されます。

いやぁ、便利ですね。システム間をファイルの受け渡しで連携するときに使えそう。
ちなみに、ファイルのイベント通知は基本ネイティブサポートされているようですが、サポートされていない場合、ポーリングのような方法でイベントを拾うようです。