operator - Java 9: ¿Cuál es la diferencia entre los archivos “Módulos” y “JAR”?
java 9 modules tutorial (3)
Estoy aprendiendo sobre Java 9 de What''s New in Java9 y uno de los temas principales en la discusión es The Modular JDK .
Tengo algunas dudas:
- ¿Los archivos JAR son módulos?
- ¿En qué se diferencia el módulo del archivo JAR?
Estrictamente hablando, un módulo es un concepto de tiempo de ejecución. Como otros han citado del sistema The State of the Module :
Un módulo es una colección de código y datos autodescriptiva y con nombre. Su código está organizado como un conjunto de paquetes que contienen tipos, es decir, clases e interfaces Java; Sus datos incluyen recursos y otros tipos de información estática.
Esto es muy similar a JARs , pero ...
- Los JAR no tienen una representación significativa en el tiempo de ejecución
- Los JAR no son "autodescriptivos", lo que en este caso significa que no tienen un nombre que le importe a la JVM, no puede expresar dependencias ni definir una API adecuada
Esto deja la pregunta, ¿de dónde vienen los módulos? Hay varias formas, pero la más importante para los desarrolladores es el JAR modular. Un JAR modular es como un JAR simple, pero contiene un descriptor de módulo , un archivo module-info.class
que se compiló desde un module-info.java
. Es ese archivo el que define el nombre, las dependencias y las API de un módulo .
Por lo tanto, existe una fuerte conexión entre los JAR y los módulos: los JAR son los contenedores a partir de los cuales el sistema de módulos crea módulos y (en este momento) cada JAR solo puede contener un único módulo. Es importante tener en cuenta que incluso en Java 9, los JAR no tienen que ser modulares, ya que los JAR simples son totalmente correctos.
¿Los archivos JAR son módulos? ¿En qué se diferencia el módulo del archivo JAR?
No, un archivo Java no es un módulo .
Solo por un ejemplo, mientras que las clases del mismo paquete podrían haberse distribuido en JARs , el mismo paquete ahora no se puede leer desde varios módulos.
Un JAR es un formato de archivo que le permite agrupar varios archivos en un solo archivo. Normalmente, esto contiene los archivos de clase y los recursos auxiliares asociados con los applets y aplicaciones.
por otro lado (he intentado describir esto aquí ~> java-module también)
Un módulo es una colección de código y datos autodescriptiva y con nombre. Su código está organizado como un conjunto de paquetes que contienen tipos, es decir, clases e interfaces Java; Sus datos incluyen recursos y otros tipos de información estática.
Esto también consiste en la declaración del módulo como se especifica con la ayuda de module-info.java
.
Cada definición de módulo es
Un artefacto de módulo , es decir, un archivo JAR modular o un archivo JMOD que contiene una definición de módulo compilada, o bien
Un directorio de módulo explotado cuyo nombre es, por convención, el nombre del módulo y cuyo contenido es un árbol de directorio "explosionado" correspondiente a una jerarquía de paquetes.
Como se introdujo con el sistema de módulos, una imagen modular está compuesta de módulos en lugar de archivos JAR. La modularidad está prevista para la configuración dinámica en términos del archivo WAR modular también.
Sin embargo, para facilitar la adopción de módulos , se introdujo un archivo JAR modular en JDK9, por ejemplo, para un módulo que consiste en un módulo- module-info.java
tal que
module com.foo.bar { }
y otras clases de java como
com/foo/bar/alpha/AlphaFactory.java
com/foo/bar/alpha/Alpha.java
Las herramientas existentes ya pueden crear, manipular y consumir archivos JAR. Un archivo JAR modular es como un archivo JAR ordinario en todas las formas posibles, excepto que también incluye un archivo module-info.class en su directorio raíz. Un archivo JAR modular para el
com.foo.bar module
anterior, por ejemplo, podría tener el contenido:
META-INF/ META-INF/MANIFEST.MF module-info.class com/foo/bar/alpha/AlphaFactory.class com/foo/bar/alpha/Alpha.class ...
Se puede usar un archivo JAR modular como módulo, en cuyo caso se considera que su archivo module-info.class contiene la declaración del módulo. Alternativamente, se puede colocar en la ruta de clases ordinaria, en cuyo caso se ignora su archivo module-info.class.
Módulo : una nueva característica de lenguaje introducida en Java 9 (similar a clase, interfaz, paquete, etc.) que consiste en una colección de paquetes, similar a cómo un paquete consiste en una colección de tipos.
JAR : un formato de archivo de archivo que agrupa código y recursos y que puede cargar la JVM.
Más específicamente, un módulo se define de la siguiente manera :
Con el fin de proporcionar una configuración confiable y una encapsulación sólida de manera que sea accesible para los desarrolladores y que sea compatible con las cadenas de herramientas existentes, tratamos a los módulos como un nuevo tipo fundamental de componente de programa Java. Un módulo es una colección de código y datos autodescriptiva y con nombre. Su código está organizado como un conjunto de paquetes que contienen tipos, es decir, clases e interfaces Java; Sus datos incluyen recursos y otros tipos de información estática.
...
La autodescripción de un módulo se expresa en su declaración de módulo , una nueva construcción del lenguaje de programación Java.
...
Una declaración de módulo se compila, por convención, en un archivo llamado
module-info.class
, ubicado de manera similar en el directorio de salida del archivo de clase.
Un módulo se puede compilar en un archivo Jar, en cuyo caso el archivo Jar está etiquetado como un archivo Jar modular :
Las herramientas existentes ya pueden crear, manipular y consumir archivos JAR, por lo que para facilitar la adopción y migración definimos los archivos JAR modulares . Un archivo JAR modular es como un archivo JAR ordinario en todas las formas posibles, excepto que también incluye un archivo
module-info.class
en su directorio raíz.
Algunas otras diferencias entre un módulo y un JAR:
Los módulos pueden requerir otros módulos para permitir el acceso a las clases dependientes por el módulo requerido. Un Jar no tiene tal concepto de dependencia.
Un módulo puede decidir qué clases e interfaces exportar a otros módulos que lo requieran. Un tarro no tiene tal mecanismo de encapsulación.
Un módulo se puede compilar en un archivo Jar modular, pero algunos módulos (por ejemplo, módulos JDK) se compilan en otro formato llamado JMOD.
El nombre es de un JAR puede ser cambiado. Mientras el cargador de clases JVM encuentre la clase necesaria en la ruta de clases (que puede estar compuesta de un solo JAR, varios JAR o una mezcla entre directorios o JAR), el nombre del archivo JAR puede ser cualquier cosa. Sin embargo, se puede hacer referencia explícita al nombre de un módulo en la declaración de otros módulos, y el nombre así lo define y no se puede cambiar libremente.