Como construir el JDK de Java 9
Java 9 está a la vuelta de la esquina, y desde Jarroba queríamos dedicar un artículo para ver como construir el jdk.
Es una buena idea pensar en ir comprobando el comportamiento de nuestras aplicaciones en este nuevo JDK, ya que aunque es retrocompatible, por ejemplo, han quitado algunas opciones del recolector de basura (DefNew + CMS, ParNew + SerialOld, Incremental CMS), y ahora G1 es el recolector por defecto.
Tenemos la opción de usar unas de versiones compiladas que están en acceso anticipado que podemos encontrar en la pagina oficial o estar a la última y divertirnos con el código fuente.
Java 9 aun no esta listo para producción, se espera que lo esté para el 2017/07/27, pero siempre conviene ver si estamos preparados. Para nuestros proyectos personales da igual las versiones que usemos, y siempre es interesante ir usando las últimas para ver qué nos depara el futuro, para producción tenemos que encontrar el balance entre estar obsoletos y correr el riesgo de que nos dejen de dar soporte (incluidas actualizaciones de seguridad, lo cual es peligroso) y arriesgarnos a estar a la última, ya que el software no está tan bien probado como cuando lleva ya bastante tiempo.
Hacer una build de la jdk no es algo muy común, ya que la mejor idea es coger un binario e instalarlo, pero a veces nos apetece cacharrear un poco, estar a la última, somos impacientes o queremos colaborar con la creación de la jdk con iniciativas como adoptopenjdk
Este articulo esta orientado a usuarios de mac osx, los pasos para otros sistemas operativos son similares, pero solo esta probado en osx.
Requisitos
- Mercurial (ya que el repositorio está en mercurial.)
- La última JDK8.
- freetype.
Si consultais algunos sitios os dirán que instaleis xquartz y luego al hacer el configure, lo hagáis de la siguiente manera:
bash configure --with-freetype-include=/usr/X11/include/freetype2 --with-freetype-lib=/usr/X11/lib --disable-warnings-as-errors --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
Los JDK se construyen usando siempre el JDK anterior, es decir, para construir el jdk 7 se usa el jdk 6, para el jdk 8 se usa el jdk 7 y para el jdk 9 se usa el jdk 8
Pasos
Clonamos el repositorio
hg clone http://hg.openjdk.java.net/jdk9/jdk9
Nos vamos al directorio que se acaba de crear
cd jdk9
Ahora tenemos dos opciones, o decirle a bash que nos ejecute el script
bash ./get_source.sh
O cambiarle los permisos (darle permisos de ejecución) y ejecutarlo
chmod u+x get_source.sh ./get_source.sh
Hacemos la configuración
bash configure --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home --disable-warnings-as-errors
Cuando acabe nos dirá algo como:
==================================================== A new configuration has been successfully created in /Users/dionisio/jdk9/build/macosx-x86_64-normal-server-release using configure arguments '--with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home --disable-warnings-as-errors'. 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-adhoc.dionisio.jdk9 (9-internal) Tools summary: * Boot JDK: java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home) * Toolchain: clang (clang/LLVM from Xcode 8.3.2) * C Compiler: Version 8.1.0 (at /usr/bin/clang) * C++ Compiler: Version 8.1.0 (at /usr/bin/clang++) Build performance summary: * Cores to use: 8 * Memory limit: 16384 MB
Creamos los ejecutables
make clean images
Y ya lo tenemos. Podemos comprobar que todo fue bien haciendo:
build/macosx-x86_64-normal-server-release/jdk/bin/java --version openjdk 9-internal OpenJDK Runtime Environment (build 9-internal+0-adhoc.dionisio.jdk9) OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.dionisio.jdk9, mixed mode)
Una de las cosas interesantes que trae Java 9 es un REPL llamado JShell. REPL significa read, eval, print and loop (como la consola de python).
- Read: Lee lo que introducimos.
- Eval: Evalúa lo que hemos escrito.
- Print: Muestra el resultado.
- Loop: Vuelve al inicio.
build/macosx-x86_64-normal-server-release/jdk/bin/jshell | Welcome to JShell -- Version 9-internal | For an introduction type: /help intro
jshell> System.out.println("Hola") Hola