MacでOracle JDK 7 (Java 7) を試す
Oracle JDKのMac版がリリースされたので、早速試してみました。
インストール
Apple のJDKがインストールされている場合は、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"をダウンロードします。
"jdk-7u4-macosx-x64.dmg"というファイルをマウントすると、"JDK 7 Update 04.pkg"というインストーラーパッケージが出てきます。
このpkgファイルをダブルクリックすればインストーラーが起動するので、そのままインストールします。
「次のステップ」というリンクをクリックすると、後述するセットアップの作業手順を示したページが表示されます。
インストールが終わったので、ここで一旦、パスが通っている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"の項目を一番上にドラッグ&ドロップして移動します。
そして、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ボタンを押す。
2)
MacOSX VM を選択して、次へ
3)
JRE home: /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home
JRE name: 任意の名前(ここではJava SE 7)
を設定して、Finish。
サンプルコード
サンプルを動かしてみましょう。
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"と表示されます。
いやぁ、便利ですね。システム間をファイルの受け渡しで連携するときに使えそう。
ちなみに、ファイルのイベント通知は基本ネイティブサポートされているようですが、サポートされていない場合、ポーリングのような方法でイベントを拾うようです。