FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

OpenJDKのJDK 9をビルドしよう #openjdk

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

みなさん、JDK 9は使っていますか?この記事ではOpenJDKのJDK 9をMacでビルドします。

実はビルドせずともダウンロードしてインストールすることもできます。

https://jdk9.java.net/download/

ですが、最新ではない場合もありますので、ここではビルドします!

Mercurial

OpenJDKのソースコードMercurialで管理されています。まだMercurialをセットアップしていない場合は、インストールしましょう。MacでHomebrewを使っている方であればbrew install hgです。

ソースコードの取得

OpenJDKのソースコードを取得します。defaultブランチの最新のソースコードを取得するよりも、バージョンのタグが付いている方がよいでしょう。タグの一覧は次のURLで見れます。

http://hg.openjdk.java.net/jdk9/jdk9/tags

上部にあるものが新しいタグです。jdk-9+xxx形式の最新のタグ名を使いましょう。今回はjdk-9+121のタグを使います。

Mercurialソースコードを取得します。

$ hg clone -r jdk-9+121 http://hg.openjdk.java.net/jdk9/jdk9/ jdk-9+121
adding changesets
adding manifests
adding file changes
added 2098 changesets with 3508 changes to 360 files
updating to branch default
284 files updated, 0 files merged, 0 files removed, 0 files unresolved

最後のjdk-9+121はクローンしたソースコードを格納するディレクトリ名です。ディレクトリに移動します。

$ cd jdk-9+121

ここからさらにソースコードを取得します。

$ bash ./get_source.sh
# Repositories: corba jaxp jaxws langtools jdk hotspot nashorn
corba: hg clone http://hg.openjdk.java.net/jdk9/jdk9/corba corba
jaxp: hg clone http://hg.openjdk.java.net/jdk9/jdk9/jaxp jaxp
jaxp: requesting all changes
...(中略)...
jdk: searching for changes
jdk: no changes found
.: searching for changes
.: adding changesets
.: adding manifests
.: adding file changes
.: added 1 changesets with 1 changes to 1 files
.: 1 files updated, 0 files merged, 0 files removed, 0 files unresolved

ビルド

これでconfigureできます。私の環境は複数のJDKが入っているので、ビルドに使うJDKを指定します。デバッグ版がほしい場合はさらに--enable-debug --with-target-bits=64オプションをつけます。

$ bash ./configure --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home
Running generated-configure.sh
configure: Configuration created at Thu Jun 9 11:14:16 JST 2016.
configure: configure script generated at timestamp 1464173584.
checking for basename... /usr/bin/basename
...(中略)...
====================================================
The existing configuration has been successfully updated in
/Users/jyukutyo/code/java-oss/jdk-9+121/build/macosx-x86_64-normal-server-release
using configure arguments '--with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home'.

Configuration summary:
* Debug level: release
* HS debug level: product
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-2016-06-09-111419.jyukutyo.jdk-9121 (9-internal)

Tools summary:
* Boot JDK: java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 7.2.1)
* C Compiler: Version 7.0.2 (at /usr/bin/clang)
* C++ Compiler: Version 7.0.2 (at /usr/bin/clang++)

Build performance summary:
* Cores to use: 4
* Memory limit: 8192 MB

WARNING: The result of this configuration has overridden an older
configuration. You *should* run 'make clean' to make sure you get a
proper build. Failure to do so might result in strange build problems.

configureできたので、make allコマンドを実行します。

$ make all
Building target 'all' in configuration 'macosx-x86_64-normal-server-release'
Building JVM variant 'server' with features 'all-gcs cds compiler1 compiler2 dtrace fprof jni-check jvmci jvmti management nmt services vm-structs'
Compiling 8 files for BUILD_TOOLS_LANGTOOLS
Creating libjsig.dylib from 1 file(s)
...(中略)...
Creating support/classlist.jar
Creating jdk jimage
Creating jre jimage
Finished building target 'all' in configuration 'macosx-x86_64-normal-server-release'

JDK9がインストールされました。さっそく使いましょう。

JDK 9を使う

build/macosx-x86_64-normal-server-release/jdkディレクトリがJAVA_HOMEとなります。

$ cd build/macosx-x86_64-normal-server-release/jdk/bin
$ ls
appletviewer jarsigner.diz javah.diz jdb jimage.diz jmap jrunscript.diz jstat orbd.diz rmid serialver.diz wsgen
appletviewer.diz java javap jdb.diz jinfo jmap.diz jsadebugd jstat.diz pack200 rmid.diz servertool wsgen.diz
idlj javac javap.diz jdeps jinfo.diz jmod jsadebugd.diz jstatd pack200.diz rmiregistry servertool.diz wsimport
idlj.diz javac.diz jcmd jdeps.diz jjs jmod.diz jshell jstatd.diz policytool rmiregistry.diz tnameserv wsimport.diz
jar javadoc jcmd.diz jhsdb jjs.diz jps jshell.diz keytool policytool.diz schemagen tnameserv.diz xjc
jar.diz javadoc.diz jconsole jhsdb.diz jlink jps.diz jstack keytool.diz rmic schemagen.diz unpack200 xjc.diz
jarsigner javah jconsole.diz jimage jlink.diz jrunscript jstack.diz orbd rmic.diz serialver unpack200.diz

JDK 9から入ったjhsdbjmodというコマンドがありますね。

$ export JAVA_HOME=~/code/java-oss/jdk-9+121/build/macosx-x86_64-normal-server-release/jdk/
$ java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-06-09-111419.jyukutyo.jdk-9121)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-06-09-111419.jyukutyo.jdk-9121, mixed mode)

ヒャッハー!9になりました。これでJavaのREPL、jshellが使えますよ!

$ ./jshell
| Welcome to JShell -- Version 9-internal
| For an introduction type: /help intro

jshell> "Hello World!"
$1 ==> "Hello World!"

サマリー

さて今回はOpenJDK 9をビルドしてみました。次回はJava 9の機能のどれかを使ってみます。

2016/06/09追記

コマンドではないですが、HSDB自体ははJava 7から使える、とのご指摘をいただけました。