Descripción

El Java Platform Module System (JPMS) se introdujo en Java 9 y le permite organizar su código agrupando un conjunto de paquetes relacionados en componentes de nivel superior llamados módulos y proporciona un mecanismo para declarar dependencias entre módulos.


Modularizar su aplicación ofrece varios beneficios:

 - Una aplicación cuyo código está organizado en módulos es más fácil de leer, más fácil de mantener y más escalable.

 - Las dependencias entre módulos se definen mediante descriptores de módulo que se verifican en el momento de la compilación y cuando se inicia la aplicación. Esta resolución temprana de dependencias ayuda a mejorar la confiabilidad del tiempo de ejecución, superando un problema de larga data en Java donde las excepciones "NoClassDefFoundError" eran causas comunes de bloqueos en las aplicaciones.

 - Los paquetes de un módulo son accesibles para otros módulos solo si se exportan explícitamente. Este principio, llamado encapsulamiento sólido, proporciona de forma predeterminada un espacio seguro para el código en el que la reflexión no puede invadir.

 - Finalmente, el sistema de módulos le permite crear imágenes de tiempo de ejecución personalizadas que contienen solo los módulos utilizados por su aplicación. El tamaño reducido del entorno de ejecución mejora notablemente el tiempo de inicio y el uso de memoria de la aplicación.


A partir de la versión 3.5.55, el archivo wrapper.jar contiene un descriptor de módulo que presenta el módulo 'org.tanukisoftware.wrapper'. Este módulo con nombre se puede incluir en imágenes de tiempo de ejecución personalizadas creadas con jlink.

ADVERTENCIA

Antes de la versión 3.5.55, wrapper.jar no era modular. Cuando se hace referencia en la ruta del módulo, se crea un módulo automático llamado 'wrapper' (derivado del nombre del archivo JAR). Este módulo automático podría usarse en otras declaraciones de módulo, pero jlink no podría usarlo para crear imágenes en tiempo de ejecución.

Si se utilizó 'wrapper' en algunos de los descriptores de su módulo y actualiza a la versión 3.5.55 o superior del Wrapper, no olvide cambiar el nombre a 'org.tanukisoftware.wrapper'.


El Wrapper proporciona varias propiedades para ayudarle a configurar cómo su aplicación utiliza módulos:

NOTA

Estas propiedades sólo se utilizan cuando se ejecutan con versiones de Java 9 o superiores. Serán ignoradas en versiones anteriores.

wrapper.java.module_path.<n>

Compatibilidad :3.5.55, Requiere Java 9+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Estas propiedades se utilizan para enumerar ubicaciones donde se pueden encontrar los módulos de su aplicación. La lista puede contener directorios o rutas a archivos jar que, opcionalmente, contienen comodines en la parte del nombre del archivo.

El Wrapper utilizará esta lista para crear la opción '--module-path' de la línea de comandos de Java.

Si se utiliza un carácter comodín dentro de una entrada de ruta del módulo, todos los archivos coincidentes se agregarán a la ruta de módulo utilizada al iniciar una instancia de JVM.

Los caracteres comodín válidos son:

  • Un carácter '*', que coincidirá con "0" (cero) o más caracteres.
  • Un carácter '?', que coincidirá exactamente con un carácter.

Ejemplos de valores posibles para elementos de rutas de módulo:
wrapper.java.module_path.1=../lib/myapp-*.jar  # archivos jar especificados con un comodín'
wrapper.java.module_path.2=../lib/tools.jar    # single jar file specified using the exact name
wrapper.java.module_path.3=../lib/ext          # folder where additional modules can be found

NOTA

El archivo wrapper.jar no debe incluirse en los valores de esta lista de propiedades. Si está presente, se eliminará de la lista al cargar la configuración.

El Wrapper usa la propiedad wrapper.jarfile para agregar automáticamente el archivo wrapper.jar en el lugar correcto en la línea de comandos dependiendo de si se usan módulos o no.


Classpath:

Java no permite que dos archivos jar distintos que contengan el mismo paquete coexistan en la lista de rutas de módulo. Este no es el caso con classpath, donde históricamente siempre se ha permitido la superposición de paquetes. Esta es una de las razones por las que classpath sigue siendo útil, al menos hasta que una aplicación pueda migrarse completamente al sistema de módulos Java 9.

Tenga en cuenta la siguiente limitación: los archivos jar enumerados en el classpath que no se pueden encontrar en ninguna ubicación de la ruta de módulo serán utilizados por la JVM como un módulo sin nombre, lo que por naturaleza lo hace inaccesible para cualquier otro módulo. Si se supone que se hace referencia a un módulo en una directiva requires de otro módulo, debe existir en una de las ubicaciones especificadas por las propiedades wrapper.java.module_path.<n> o wrapper.java.upgrade_module_path.<n>.


Problemas?

Si encuentra algún problema relacionado con la ruta del módulo, lo primero que debe hacer es verificar la ruta del módulo completa que genera el Wrapper. Para hacer esto, habilite la salida del registro de depuración con la propiedad wrapper.debug o habilite la visualización del comando Java usando la propiedad wrapper.java.command.loglevel.

NOTA

Ruta del módulo que contiene espacios:

El Wrapper manejará correctamente los elementos de la ruta del módulo que contengan espacios. Esto lo hace más tarde el Wrapper poniendo entre comillas la ruta final del módulo generado. Los valores de propiedad de los elementos de ruta de módulo individuales nunca deben definirse que contengan comillas, incluso si contienen espacios.

wrapper.java.module_path.missing.loglevel

Compatibilidad :3.5.55, Requiere Java 9+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

De forma predeterminada, el Wrapper registrará advertencias sobre cualquier elemento faltante de la ruta de módulo en el nivel de registro DEBUG. Es bastante común querer ver estos mensajes de registro generados sin habilitar también todos los resultados de depuración. Esta propiedad permite especificar el nivel de registro en el que se registrarán las advertencias.

Los valores válidos de la propriedad incluyen:
  • FATAL :
    para registrar en el nivel de registro FATAL.
  • ERROR :
    para registrar en el nivel de registro ERROR.
  • WARN :
    para registrar en el nivel de registro WARN.
  • STATUS :
    para registrar en el nivel de registro STATUS.
  • INFO :
    para registrar en el nivel de registro INFO.
  • DEBUG :
    para registrar en el nivel de registro DEBUG.
  • NONE :
    seleccione X para no registrar nunca.

El valor predeterminado es DEBUG.

Example:
wrapper.java.module_path.missing.loglevel=DEBUG

Si a su aplicación a menudo le faltan archivos jar, configurar este valor en NONE deshabilitará las advertencias en cualquier nivel de registro.

Los elementos de Ruta de Módulo que se definen como comodines también registrarán una advertencia si el comodín no coincide con al menos un archivo. Esto puede suceder si el directorio no existe o está vacío.

wrapper.java.upgrade_module_path.<n>

Compatibilidad :3.5.55, Requiere Java 9+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Estas propiedades definen una lista similar a wrapper.java.module_path.<n>, pero permiten anular los módulos actualizables contenidos en la imagen de tiempo de ejecución.

Al igual que para wrapper.java.module_path.<n>, la lista puede contener directorios o rutas a archivos jar que opcionalmente contienen comodines en la parte del nombre del archivo. Para obtener más detalles sobre la sintaxis, consulte la sección anterior.

El Wrapper utilizará esta lista para construir la opción '--upgrade-module-path' de la línea de comandos de Java.

NOTA

No es necesario incluir wrapper.jar en los valores de esta lista de propiedades.

El Wrapper utiliza la propiedad wrapper.jarfile para agregar automáticamente wrapper.jar en el lugar correcto en la línea de comando dependiendo de si se utilizan módulos o no.

wrapper.java.upgrade_module_path.missing.loglevel

Compatibilidad :3.5.55, Requiere Java 9+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

De forma predeterminada, el Wrapper registrará advertencias sobre cualquier elemento faltante en la ruta del módulo de actualización en el nivel de registro DEBUG. Es bastante común querer ver estos mensajes de registro generados sin habilitar también toda la salida de depuración. Esta propiedad permite especificar el nivel de registro en el que se registrarán las advertencias.

Los valores válidos de la propriedad incluyen:
  • FATAL :
    para registrar en el nivel de registro FATAL.
  • ERROR :
    para registrar en el nivel de registro ERROR.
  • WARN :
    para registrar en el nivel de registro WARN.
  • STATUS :
    para registrar en el nivel de registro STATUS.
  • INFO :
    para registrar en el nivel de registro INFO.
  • DEBUG :
    para registrar en el nivel de registro DEBUG.
  • NONE :
    para no registrar nunca.

El valor predeterminado es DEBUG.

Example:
wrapper.java.upgrade_module_path.missing.loglevel=DEBUG

Si a su aplicación a menudo le faltan archivos jar, configurar este valor en NONE deshabilitará las advertencias en cualquier nivel de registro.

Los elementos de ruta del módulo de actualización que se definen como comodines también registrarán una advertencia si el comodín no coincide con al menos un archivo. Esto puede suceder si el directorio no existe o está vacío.

wrapper.java.module.<n>

Compatibilidad :3.5.55, Requiere Java 9+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Estas propiedades se utilizan para enumerar los nombres de los módulos raíz utilizados por su aplicación. Los módulos raíz son módulos que no se pueden extraer en el gráfico de módulos cuando se inicia la aplicación, ya sea porque no son requeridos por ningún otro módulo o porque son dependencias opcionales (es decir, se especifican con 'requires static' en un descriptor de módulo).

El Wrapper utilizará esta lista para crear la opción '--add-modules' de la línea de comando.

Además de los nombres de los módulos, la lista puede incluir los siguientes tokens:

Consulte la especificación de JDK para obtener una descripción más detallada.

wrapper.java.module.<n>.enable_native_access

Compatibilidad :3.6.1, Requires Java 24+
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

A partir de JDK 24, como parte de una política de integridad predeterminada, el acceso al código nativo mediante JNI o ??FFM está sujeto a restricciones. Operaciones como System::loadLibrary (JNI) yLinker::downcallHandle (FFM) generarán advertencias o podrán generar excepciones a menos que cuenten con la aprobación explícita del desarrollador de la aplicación.

Ejemplo de una advertencia impresa con Java 24:
jvm 1    | WARNING: A restricted method in java.lang.System has been called
jvm 1    | WARNING: java.lang.System::loadLibrary has been called by com.foo.Server in module com.foo (file:/path/to/com.foo.jar)
jvm 1    | WARNING: Use --enable-native-access=com.foo to avoid a warning for callers in this module
jvm 1    | WARNING: Restricted methods will be blocked in a future release unless native access is enabled

Las propiedades wrapper.java.module.<n>.enable_native_access permiten habilitar el acceso nativo a módulos específicos. Estas propiedades se ignoran al ejecutarse en versiones de Java anteriores a 24.

El valor predetermindo es "FALSE", para seguir el principio de integridad por defecto.

Habilitar 'com.foo' para acceder al código nativo:
wrapper.java.module.1=com.foo
wrapper.java.module.1.enable_native_access=TRUE

NOTA

El Wrapper utiliza código nativo para el correcto funcionamiento de varias funcionalidades importantes. Por ello, el módulo 'org.tanukisoftware.com' tendrá acceso automático al código nativo, y esta configuración no se puede modificar.

Cuando se hace referencia a archivos jar en la ruta de clases, pertenecen a un módulo predeterminado conocido como módulo ALL-UNNAMED. También es posible habilitar este módulo para que acceda al código nativo. Sin embargo, para mayor seguridad, recomendamos adoptar un enfoque granular donde la aplicación se estructura en módulos distintos y se otorga acceso al código nativo solo a los módulos que realmente lo requieren.

Habilitar 'ALL-UNNAMED' para acceder al código nativo:
wrapper.java.module.1=ALL-UNNAMED
wrapper.java.module.1.enable_native_access=TRUE

Consulte la página JDK 24: Prepara el acceso nativo restringido. para obtener una descripción más detallada.