Aquí hay una pregunta común: ¿Hay una superposición entre Maven y JPMS?
La respuesta es no: se complementan entre sí.
Mientras que la modularización tiene que ver más con la encapsulación y la visibilidad (es decir, decidir qué paquetes se pueden ver fuera de un módulo/JAR), Maven tiene que ver con la gestión de las dependencias y la compilación del código en artefactos. Estas dos cosas funcionan a diferentes niveles.
En el tema de la gestión de la dependencia, cada artefacto Maven tiene tres partes:
- Una identificación de grupo, que identifica de manera única el proyecto al que pertenece
- Una identificación de artefacto, que es su nombre
- Una versión
El JPMS no conoce las versiones y, dependiendo de las convenciones de nomenclatura, el nombre de un módulo de Java puede ser el mismo que el del artefacto, la unión del grupo y el ID del artefacto, o algo completamente diferente.
El resultado final es que, debido a esto, no podemos asociar directamente un módulo de Java con una dependencia/artefacto de Maven POM. Esto significa que:
- Maven no puede generar el archivo module-info.java.
- En una aplicación modular, añadir una dependencia implica dos pasos ahora: Añadir la dependencia al archivo POM como siempre. Esta dependencia puede ser modularizada o no, no importa. Aunque no esté modularizada, se convierte automáticamente en un módulo. El módulo de la dependencia se añade al archivo module-info.java del proyecto.
Por ejemplo, supongamos que nuestro proyecto consta de dos módulos, uno para la API y otro para la interfaz gráfica de usuario, que depende del módulo de la API.
Podemos estructurar nuestro proyecto con módulos Maven. A alto nivel, el concepto es básicamente el mismo. Así es como se vería el pom.xml padre:
1234567891011121314151617181920212223242526272829303132333435363738<projectxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation="http://maven.apache.org/POM/4.0. 0 http://maven.apache.org/maven-v4_0_0.xsd"³;Â "Â";Â "Â";Â";Â "Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â";Â". plugins</groupId><artifactId;maven-compiler-plugin</artifactId;;/versión 3.7. --...proyecto... xmlNada es diferente de lo que estamos acostumbrados, excepto quizás por la configuración del maven-compilador-plugin. Asegúrate de usar al menos la versión 3.6.1.
La estructura del directorio del proyecto puede ser similar a la siguiente:
12345678910111213141516171819||─ api| |─ pom.xml| |─ src| |─ main| |─ java| |─ module-info. java| |─ my| |─ ejemplo| |─ api|─ gui| |─ pom.xml| |─ src| |─ main| |─ java| |─ module-info.java| |─ my| |─ ejemplo| |─ gui|- pom.xmlPara el módulo API, el pom.xml se verá así:
1234567891011121314151617181920212223242526<projectxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"<modelVersion 0</modelVersion();;parent();;groupId();org.example();/groupId();;artifactId();my-parent();/artifactId();version();1. --...dependencias... --...proyecto... xmlEste sería el contenido del archivo module-info.java:
1234modulemy.company.api{exportsmy.company.api;// ...}java
Ahora, en el módulo GUI, tenemos que añadir la dependencia del proyecto API a su pom.xml:
12345678910111213141516171819202122232425262728293031<projectxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"<modelVersion ejemplo</groupId><artefactoIdentificador</artifactoIdentificador<versión ejemplo</grupoIdentificador&&api</aficionado&&a versión&1.0</versión&&aficionado&aficionado&aficionado&aficionado;! --...dependencia... --...proyecto... xmlAsí como en module-info.java:
1234modulemy.company.webapp{requiresmy.company.api;// ...}java
De esta manera, cuando sea el momento de construir el proyecto (por ejemplo, con el paquete mvn), el plug-in del compilador Maven configurará la ruta del módulo para que el compilador Java pueda funcionar correctamente.