tutorial operator modules module java-9 jigsaw

operator - java modules



¿Cómo agregar un módulo Java 9 a través de manifest.mf? (3)

Mi biblioteca Java debe ser compatible con Java 8 y Java 9. Para ejecutar con Java 9 necesitamos algunos de los módulos de Java 9.

Sé que puedo agregarlo a través de la línea de comandos con --add-modules . Pero es una biblioteca y no puedo controlar la línea de comando.

¿Puedo agregar esto con el manifest.mf ? ¿O hay alguna otra solución que sea compatible con Java 8?


Los módulos expresan dependencias en su declaración de módulo , por lo que debe crear un module-info.java , definir el nombre de su módulo, las dependencias (en su caso requires java.activation y requires java.xml.bind ) y las exportaciones (más sobre eso más adelante) )

La declaración del módulo debe ser compilada por un compilador de Java 9 para crear un módulo descriptor module-info.class que pertenece a la carpeta raíz del JAR.

Java 8 y 9

Las versiones de Java anteriores a 9 ignorarán el module-info.class , lo que significa que si compila el resto de su código para Java 8 (ya sea usando javac 8 o usando el nuevo --release flag en javac 9 ), su biblioteca aún funciones en esa versión.

¿Solucionará tu problema?

Incluso Java 9 solo procesará su JAR como un módulo si termina en la ruta del módulo . Solo entonces verá las cláusulas requires e incluirá los módulos de Java EE que está utilizando en el gráfico del módulo . Esto significa que el cliente que use su biblioteca en la ruta de clase de Java 9 todavía tendrá que agregar manualmente los dos módulos a través de la línea de comando.

Modulación completa

Si su módulo se utiliza en la ruta del módulo, las reglas de accesibilidad se aseguran de que:

  1. sus clientes solo pueden usar tipos públicos en paquetes que haya exportado (en compilación y en tiempo de ejecución)
  2. su código solo ve módulos de los que depende

Esto significa:

  1. debe incluir exportaciones en su declaración de módulo
  2. debe declarar todas las dependencias, no solo en los dos módulos JDK

Particularmente, el segundo punto puede ser difícil si depende de proyectos que aún no están modularizados, pero esa es otra cuestión. 😉


MANIFEST.MF no tiene nada que ver con las dependencias. Lo que necesita es crear un archivo module-info.java y declarar su dependencia allí:

module <module-name> { requires <dependency>; ... }

Sin embargo, si compila module-info.java y simplemente coloca module-info.class en su JAR, Java 8 no podrá ejecutarlo. ¿Entonces lo que hay que hacer? Hay una nueva característica en Java 9: ​​archivos JAR de liberación múltiple ( JEP 238 ). La idea es que puede colocar los archivos de la clase Java 9 en un directorio especial ( META-INF/version/9/ ) y Java 9 los manejará adecuadamente (mientras que Java 8 los ignorará).

Entonces, estos son los pasos que debes realizar:

  • Compila todas las clases excepto module-info.java con javac --release 8
  • Compilar module-info.java con javac --release 9 .
  • Cree un archivo JAR para que tenga la siguiente estructura:

JAR root - A.class - B.class - C.class ... - META-INF - versions - 9 - module-info.class

El JAR resultante debería ser compatible con Java 8 y Java 9.

ACTUALIZAR:

Resulta que no es necesario poner module-info.class en la carpeta META-INF . Puedes ponerlo en la raíz del JAR. Esto tendrá el mismo efecto.