plugin compiler java maven java-9 java-module jigsaw

java - maven-compiler-plugin



Cómo agregar "requiere" para artefactos que tienen "-"(guión) en su nombre (2)

He incluido estas dependencias en mi pom.xml de Maven:

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>

Estoy tratando de agregar esta dependencia en module-info.java así:

module io.github.wildcraft.restclient { requires httpcore; // no compilation problem requires httpclient; // no compilation problem requires commons-io; // shows compilation error }

Para commons-io, recibo un error de compilación. ¿Cómo puedo hacer este trabajo?


Version corta

El uso requires commons.io . (En general, vea la respuesta de nullpointer sobre cómo aprender el nombre de un módulo).

Versión larga

Como commons-io.jar aún no está modularizado, está creando un módulo automático, para el cual el sistema de módulos debe tener un nombre. El Javadoc de ModuleFinder describe cómo sucede eso:

El buscador de módulos devuelto por este método admite módulos empaquetados como archivos JAR. [...] Un archivo JAR que no tiene un module-info.class en su directorio de nivel superior define un módulo automático, de la siguiente manera:

  • Si el archivo JAR tiene el atributo "Automatic-Module-Name" en su manifiesto principal, su valor es el nombre del módulo. De lo contrario, el nombre del módulo se deriva del nombre del archivo JAR.

  • La versión y el nombre del módulo [...] se derivan del nombre de archivo del archivo JAR de la siguiente manera:

    • [...]

    • Todos los caracteres no alfanuméricos ([^ A-Za-z0-9]) en el nombre del módulo se reemplazan con un punto ("."), Todos los puntos que se repiten se reemplazan con un punto, y todos los puntos iniciales y finales se eliminan.

Las dos últimas viñetas se aplican a los módulos automáticos que no están preparados para Java 9, por ejemplo, a commons.io . Este ejemplo del mismo Javadoc explica qué sucede en su caso:

  • Como ejemplo, un archivo JAR llamado "foo-bar.jar" derivará un nombre de módulo "foo.bar" y ninguna versión. Un archivo JAR llamado "foo-bar-1.2.3-SNAPSHOT.jar" derivará un nombre de módulo "foo.bar" y "1.2.3-SNAPSHOT" como la versión.

Por lo tanto requires commons.io debería funcionar.


Agregando a la versión más corta de la answer proporcionada por Nicolai. Para averiguar el nombre del módulo de las dependencias (jar) utilizadas en su proyecto, puede usar la herramienta jar desde la línea de comandos.

jar --file=<jar-file-path> --describe-module

Dado que la herramienta los entendería como un módulo automático , la salida sería algo así como:

$ / jar --file=commons-lang3-3.6.jar --describe-module No module descriptor found. Derived automatic module. [email protected] automatic // this is what you need to use without the version requires java.base mandated contains org.apache.commons.lang3 contains org.apache.commons.lang3.arch contains org.apache.commons.lang3.builder contains org.apache.commons.lang3.concurrent contains org.apache.commons.lang3.event contains org.apache.commons.lang3.exception contains org.apache.commons.lang3.math contains org.apache.commons.lang3.mutable contains org.apache.commons.lang3.reflect contains org.apache.commons.lang3.text contains org.apache.commons.lang3.text.translate contains org.apache.commons.lang3.time contains org.apache.commons.lang3.tuple