El proyecto Jigsaw de Java 8
miércoles, enero 11, 2012 at 4:30PM
ecamacho in Oracle, ceylon, javaSE, jboss, jdk, jigsaw, osgi

Una de los cambios más importantes que se están cocinando en Java 8 y no, no son los closures, es el proyecto Jigsaw que busca llenar uno de los huecos más importantes de la plataforma hasta el momento: la modularidad. 

Entendiendo por modularidad el hecho de poder dividir tus aplicaciones en módulos que puedan cargarse de forma independiente y depender entre sí. Lo importante de esto para nosotros los programadores es que podremos librarnos del jar hell, el típico escenario donde tenemos en nuestro proyecto varias versiones de una misma biblioteca y no hay forma de especificar que para cierta parte de nuestra aplicación necesitamos X versión y para otra, Y.

Además de mejorar la mantenibilidad y la encapsulación de nuestra aplicación porque, en teoría, podríamos tener módulos poco acoplados entre sí. Por lo que podríamos hacer cambios dentro de uno, minimizando el impacto de estos cambios ya que los modulos dependerían entre sí sólo a través del contrato público especificado para cada uno.

Mark Reinhold, el líder del proyecto en Oracle, ha publicado un documento: Proyect Jigsaw, the Big Picture - DRAFT 1 donde presenta un resumen de los objetivos del proyecto así de cómo piensan lograrlos.

En el documento, se presentan los principios de diseño de Jigsaw:

  1. La modularidad es un constructor del lenguaje. Se extenderá el lenguaje Java para soportar módulos, de tal forma que así como se tienen clases e interfaces, ahora también habrá módulos.
  2. Los límites de los módulos deben fomentarse. Los módulos deben de definir la visibilidad de sus clases e interfases así como limitar su acceso de acuerdo a dicha visibilidad.
  3. Es suficiente resolver los módulos de forma estática y con una sola versión. La mayoría de las aplicaciones no necesitan quitar/poner módulos en tiempo de ejecución o tener varios módulos con diferentes versiones ejecutándose al mismo tiempo; por lo que Jigsaw se enfocará a cargar aplicaciones que no lo requieran; aunque se buscará que también soporte los otros escenarios. 

 

Las fases en que Java resolverá los módulos:

  1. Compilación
  2. Instalación. Si usas algun servidor que tenga módulos preinstalados, Java los encontrará cuando instales tu aplicación en él.
  3. Ejecución. Java será capaz de encontrar de forma dínamica y en tiempo de ejecución los módulos de los que depende tu aplicación.

 

Por default, los módulos se declararán en un archivo llamado module-info.java y tendrán la siguiente estructura:


module foo @ 1.0 {           //declara un módulo y su versión
    exports foo;             //declara que este módulo exporta las clases en el paquete foo
}
module bar {
    requires public foo;    // Re exporta los tipos exportados por foo
}
module baz {
    requires bar @ >= 1.0;           // Declara dependencia al módulo bar, versiones 1.0 o superiores
    class baz.Main           //declara la clase de entrada al módulo
}

Existen otros tipos, como Views y otras opciones como declarar dependencias opcionales, las puedes ver en el Draft de Reinhold.

Jigsaw, como puedes ver, es uno de los cambios más importantes a la plataforma Java de los últimos años.

Otros han intentado con moderado éxito hacerlo: OSGi es sin duda la iniciativa más importante para agregar modularidad a Java y si bien ha tenido cierto éxito, sobre todo dentro de la fundación Eclipse donde es el sistema usado para la gestión de plugins, no ha terminado de llegar al mainstream dado que resulta complejo de gestionar por toda la "magia" de class loaders que tiene que hacer por detrás, en su momento SpringSource buscó llevarlo a sus servidores y a sus librerías pero ha dejado de lado ese intento por dicha complejidad añadida.

JBoss Modules es otra iniciativa que busca lo mismo y que es usado dentro de su servidor de aplicaciones y ahora Ceylon, el lenguaje que desarrolla dicha empresa, también tiene una propuesta para módulos (basada en JBoss Modules) que tiene además un sistema de repositorios para que, como lo hace  el sistema de paquetes de Debian, las gems de Ruby o el mismo Maven, se puedan bajar los módulos de servidores.

Una de las ventajas de Jigsaw sobre estos, es que no será una librería construida encima de Java, sino estará directamente en la plataforma, con lo que podría resolver el problema de complejidad excesiva en los class loaders con los que estas se han encontrado.

¿Qué te parece esta nueva iniciativa? ¿Te ves a ti mismo usándola activamente una vez sea publicada?



Article originally appeared on javaHispano (http://www.javahispano.org/).
See website for complete article licensing information.