22
Jigsaw Modularización en el JDK 9 @SuperSerch JVM MX

Jvmmx jigsaw

Embed Size (px)

Citation preview

JigsawModularización en el JDK 9

@SuperSerch

JVM MX

Jigsaw en el tiempo• Propuesto a finales del 2008 para JDK 7, que

debería estar listo a principios del 2010

• llegó 2009

• JDK 7 sale en 2011 y pospone jigsaw para JDK8, que debería estar listo a mediados 2013

• JDK 8 sale en 2014 y pospone jigsaw para JDK9, que deberá estar listo en Septiembre 2016Marzo 2017

JDK Monolítico

• Tamaño del JDK 6 (Oct 2008)

• JRE ~16MB, JDK ~80MB

• Tamaño del JDK 8

• JRE ~60MB, JDK ~160MB

Classpath hell./activation-1.0.2.jar:./antlr-runtime-4.0.jar:./arq-2.8.5.jar:./arthurdo.jar:./bigdata-1.0.1.jar:./bliki-3.0.6.jar:./bsh-core-2.0b4.jar:./ChatServer.jar:./chiba-1.4.0.jar:./chiba-web-2.2.0.jar:./cmu_time_awb.jar:./cmu_us_kal.jar:./cmudict04.jar:./cmulex.jar:./cmutimelex.jar:./colt-1.2.0.jar:./commons-beanutils-1.7.jar:./commons-codec-1.3.jar:./commons-collections-2.1.jar:./commons-digester-1.7.jar:./commons-email-1.1.jar:./commons-fileupload-1.2.1.jar:./commons-httpclient-3.0.1.jar:./commons-io-1.3.jar:./commons-jxpath-1.2-chiba-patched.jar:./commons-logging-1.1.1.jar:./commons-pool-1.5.6.jar:./concurrent.jar:./ctc_utils-5-4-2005.jar:./cweb-extser-0.1-b2-dev.jar:./dojo.jar:./dom4j-1.6.1.jar:./dsi-utils-1.0.6-020610.jar:./dwr-1.1.1.jar:./en_us.jar:./facebook-java-api-3.0.0-SNAPSHOT.jar:./facebook-java-api-schema-3.0.0-SNAPSHOT.jar:./fastutil-5.1.5.jar:./fckeditor-java-core-2.4.1.jar:./fileupload-ext.jar:./fontbox-0.1.0.jar:./freetts.jar:./gnu-crypto.jar:./groovy-all-1.6.3.jar:./guava-16.0.1.jar:./hadoop-common-2.3.0.jar:./hibernate3.jar:./high-scale-lib-v1.1.2.jar:./hsqldb.jar:./icu4j-3_6.jar:./iri-0.8.jar:./isorelax.jar:./iText-2.1.5.jar:./iText-rtf-2.1.5.jar:./jasperreports-3.7.0.jar:./jaxen-core.jar:./jaxen-jdom.jar:./jcommon-1.0.9.jar:./jcr-1.0.jar:./jdom.jar:./jena-2.6.3.jar:./jfreechart-1.0.13.jar:./json.jar:./jxl.jar:./jython.jar:./lgpl-utils-1.0.6-020610.jar:./log4j-1.2.15.jar:./lucene-analyzers-3.6.0.jar:./lucene-core-3.6.0.jar:./lucene-spellchecker-3.6.0.jar:./mail-1.3.3.jar:./mongo-2.7.0.jar:./msv.jar:./mysql-connector-java-5.1.28-bin.jar:./openrdf-sesame-2.3.0-onejar.jar:./PDFBox-0.7.3.jar:./poi-3.7-20101029.jar:./poi-ooxml-3.7-20101029.jar:./poi-ooxml-schemas-3.7-20101029.jar:./poi-scratchpad-3.7-20101029.jar:./quercus.jar:./resin-util.jar:./saxon-8.7.jar:./saxon-dom-8.7.jar:./saxpath.jar:./sdb-1.3.2.jar:./serializer.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./snappy-java-1.1.0.1.jar:./spring.jar:./stax-api-1.0.1.jar:./SWB3Resources.jar:./SWBAdmin.jar:./SWBBase.jar:./SWBBigDataInt.jar:./SWBCommunity.jar:./SWBDimensionDataSupport.jar:./SWBJCR170.jar:./SWBModel.jar:./SWBNLP.jar:./SWBOffice.jar:./SWBOfficeComunicationInterfaces.jar:./SWBOpenSocial.jar:./SWBPlatform.jar:./SWBPortal.jar:./SWBPortlet.jar:./SWBRepositoryManager.jar:./SWBSearch.jar:./SWBSemanticFileRepository.jar:./SWBSIP.jar:./SWBTOWB3Compatibility.jar:./SWBTripleStore.jar:./SWBTripleStoreBase.jar:./SWBTripleStoreLevelDB.jar:./SWBTripleStoreMongo.jar:./SWBVirtuosoInt.jar:./SWBXMLRPCCommon.jar:./SWBXMRPCServer.jar:./tdb-0.8.7.jar:./twitter4j-2.0.9.jar:./virt_jena.jar:./virtjdbc3.jar:./wstx-asl-3.2.9.jar:./xalan.jar:./xercesImpl-2.7.1.jar:./xml-apis.jar:./xmlbeans-2.3.0.jar

setAccessible(true)❌

Modificadores de Acceso (1995-2015)

• public

• protected

• <package>

• private

Modificadores de Acceso (2015-…)

• public para todos

• public pero sólo para ciertos módulos

• public pero sólo dentro de un módulo

• protected

• <package>

• private

Tipos de APIs en Java

• Soportados, de uso público

• JCP - java.*, javax.*

• específicos del JDK - com.sun.*, jdk.*

• No Soportados, de uso interno del JDK

• sun.* principalmente

web.archive.org del 15 de febrero de 1998

APIs no soportados mas utilizados

• sun.misc.BASE64Encoder

• sun.misc.Unsafe

• sun.misc.BASE64Decoder

Encontrando usos de APIs internos

$ jdeps -jdkinternals archivo.jar

Declarando Módulos

• La información del módulo se escribe en el archivo module-info.java en el directorio raíz del código del módulo

• se usan las palabras module, requires, exports, y requires public para definir las relaciones de acceso entre módulos

Declarando Módulosmodule-info.java mx/info/swb/datos/Dao.java mx/info/swb/interno/Mail.java mx/info/swb/interno/Util.java mx/info/swb/modelo/Page.java mx/info/swb/modelo/User.java mx/info/swb/portal/Portal.java

module-info.java

module mx.info.swb {

}

Declarando Módulosmodule-info.java mx/info/swb/datos/Dao.java mx/info/swb/interno/Mail.java mx/info/swb/interno/Util.java mx/info/swb/modelo/Page.java mx/info/swb/modelo/User.java mx/info/swb/portal/Portal.javamodule-info.java

module mx.info.swb { requires mx.info.base; requires java.sql;

} mx.info.base

java.sql

Declarando Módulospackage java.sql; import java.util.logging.Logger;

public class Driver { public Logger getParentLogger()

{…} . .

}

module java.sql { requires public java.logging; . .

}

mx.info.base

java.sql

mx.info.swb

java.logging

Declarando Módulosmodule-info.java mx/info/swb/datos/Dao.java mx/info/swb/interno/Mail.java mx/info/swb/interno/Util.java mx/info/swb/modelo/Page.java mx/info/swb/modelo/User.java mx/info/swb/portal/Portal.javamodule-info.java

module mx.info.swb { exports mx.info.swb.modelo; exports mx.info.swb.portal;

}

❌ ❌

Creando Módulos

$ javac -modulesourcepath src -mp lib -d mods *

$ jar --create --file mlib/mylib.jar -C mods/mylib .

$ jar --create --file mlib/mylib.jar \ --main-class myapp.Main -C mods/mylib .

--module-version=1.0.1

Ejecutando

$ java -mp mlib:lib -m myapp

Módulos automáticos

• Módulos “reales”

• No se requieren cambios al jar de alguien mas

• El nombre de deriva del nombre del jar

• Exporta todos sus paquetes

• Requiere todos los otros módulos

Linking

$ jlink --modulepath $JDKMODS:mlib --addmods myapp -output img

$ ls imgbin conf lib release

$ ls img/binjava keytool myapp

Linking (cont)

$ img/bin/java -listmods [email protected]@[email protected]@[email protected]

$ img/bin/myapp

¿Preguntas?