java maven jodatime java-9 jlink

java - ¿Hay alguna manera de agregar dependencias maven mientras se usa el complemento maven-jlink-plugin?



jodatime java-9 (3)

Esto no tiene mucho que ver con el complemento, creo . El módulo joda.time en su caso parece ser un módulo automático .

La herramienta jlink no admite la vinculación de módulos automáticos porque pueden confiar en el contenido arbitrario del classpath, lo que va en contra de la idea de un tiempo de ejecución Java autónomo.

Entonces, hay dos formas de solucionar esto probablemente:

  • (no es el propietario del jar) Temporalmente, cree un module-info.java [podría usar la herramienta jdeps para él] y actualice el jar [usando la herramienta jar ] con la clase compilada correspondiente como en proyectos en Java 9.

  • (usted es el propietario de la dependencia) Migre permanentemente el jar a Java 9, donde consistiría en el module-info.class por sí solo después de ser compilado y empaquetado.

Estoy usando este proyecto Github para exponerme a las nuevas características modulares en Java 9. Me gustaría agregar dependencias al proyecto y poder construir una imagen nativa. Sin embargo, cuando intento agregar una nueva dependencia al pom.xml, y agrego la declaración require al module-info.java, obtengo el siguiente error del maven-jlink-plugin:

Error: module-info.class not found for joda.time module

Estoy tratando de usar esto como una prueba de concepto de que puedo desplegar imágenes usando la nueva fase de enlace, pero naturalmente necesito tener dependencias externas y necesito usar maven (restricción de trabajo).

Cambios en mod-jar / pom.xml

... <dependencies> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency> </dependencies> ...

mod-jar / module-info.java

module com.soebes.nine.jar { requires java.base; requires joda.time; exports com.soebes.example.nine.jar; }

Registros:

[INFO] --- maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) @ mod-jlink --- [INFO] Toolchain in maven-jlink-plugin: jlink [ /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/jlink ] [INFO] The following dependencies will be linked into the runtime image: [INFO] -> module: com.soebes.nine.one ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-1/target/jmods/com.soebes.nine.one.jmod ) [INFO] -> module: com.soebes.nine.two ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-2/target/jmods/com.soebes.nine.two.jmod ) [INFO] -> module: com.soebes.nine.jar ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-jar/target/com.soebes.nine.jar-1.0-SNAPSHOT.jar ) [INFO] -> module: joda.time ( /Users/sebastianrestrepo/.m2/repository/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar ) [ERROR] Error: module-info.class not found for joda.time module [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] parent ............................................. SUCCESS [ 1.460 s] [INFO] com.soebes.nine.one ................................ SUCCESS [ 2.022 s] [INFO] com.soebes.nine.two ................................ SUCCESS [ 1.392 s] [INFO] com.soebes.nine.jar ................................ SUCCESS [ 1.388 s] [INFO] mod-jlink .......................................... FAILURE [ 1.061 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.911 s [INFO] Finished at: 2017-11-03T15:27:35-04:00 [INFO] Final Memory: 26M/981M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) on project mod-jlink:

Realmente apreciaria cualquier ayuda. Gracias.


Permítanme intentar explicar un poco los antecedentes técnicos sobre esto:

joda-time en la versión 2.9.9 como se indica en la pregunta es un jar no modular, no contiene una clase de información de módulo y no se declara como un módulo automático mediante el uso de un nombre de módulo automático: en su META-INF / MANIFEST.MF

Las clases en un módulo real no pueden llamar a clases en el classpath, por lo que no puede usar el "requiere jode.time" en la información de su módulo con esa versión.

Los módulos automáticos pueden usar clases en ClassPath. Para usar las clases de un jar no modular en un módulo real, puede usar un contenedor que es un módulo automático.

Por el momento, existe una versión 2.10.1 de joda-time que es un módulo automático y declara "Automatic-Module-Name: org.joda.time", por lo que puede usar un "requiere org.joda.time" en su módulo real con esa nueva versión.

Ahora, la nueva herramienta jlink no puede funcionar directamente con jarras no modulares o jarras automáticas y el complemento maven-jlink actualmente es básicamente un envoltorio maven alrededor de la herramienta jlink que traduce sus parámetros de configuración en argumentos para la herramienta jlink.

Para crear un Java Runtime personalizado para proyectos que utilizan dependencias mixtas de Maven con módulos reales, módulos automáticos y frascos no modulares, debe conocer todas las dependencias de los módulos del sistema de sus módulos reales, módulos automáticos y frascos no modulares y luego usar un parámetro --add-modules para jlink con estos.

Para recopilar las dependencias del módulo del sistema, puede usar la nueva herramienta jdeps con el parámetro --print-module-deps o --list-deps dependiendo de la versión JDK real que se esté utilizando.

Si está utilizando Maven para su proyecto, puede automatizar esa tarea creando o utilizando un complemento Maven que lo haga por usted.


Puede usar el complemento ModiTect Maven para agregar un descriptor de módulo al JAR y crear una imagen de tiempo de ejecución modular con ese módulo.

Descargo de responsabilidad: soy el autor de ModiTect.