9 - Multi-módulos y proyectos grandes

Objetivo del tema

En este tema aprenderás qué es un proyecto multi-módulo en Apache Maven, cómo configurar el POM padre, definir la relación entre módulos, estructurar soluciones complejas y aplicar buenas prácticas en contextos empresariales.

9.1 ¿Qué es un proyecto multi-módulo en Maven?

Un proyecto multi-módulo (tambien llamado aggregator) agrupa varios módulos Maven bajo un POM padre que coordina dependencias, versiones y tareas de construcción. Cada módulo puede ser un microservicio, una librería compartida o un cliente, pero todos se construyen de forma uniforme.

  • El POM padre define la información común y lista los módulos que forman parte del conjunto.
  • Los módulos comparten repositorio local y pueden depender entre sí mediante coordenadas internas.
  • Ejecutar un comando en el directorio padre desencadena las operaciones en cascada para todos los módulos incluidos.

9.2 Configuración del pom.xml padre

El POM padre tiene tipo pom y actúa como agregador. Allí se declaran los módulos y se centralizan dependencias o plugins compartidos.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ejemplo</groupId>
  <artifactId>plataforma</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>api</module>
    <module>servicio</module>
    <module>cliente</module>
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>3.2.5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>
  • El packaging pom indica que este artefacto no genera un JAR propio.
  • La sección <modules> se rellena con rutas relativas a cada módulo.
  • El <dependencyManagement> permite unificar versiones para todos los proyectos hijos.

9.3 Relación entre módulos

Cada módulo tiene su propio POM, donde declara al POM padre como dependencia de herencia mediante la sección <parent>. Así hereda configuraciones y puede definir dependencias internas.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.ejemplo</groupId>
    <artifactId>plataforma</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <artifactId>api</artifactId>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>com.ejemplo</groupId>
      <artifactId>servicio</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>
  • La herencia garantiza que las propiedades, plugins y repositorios declarados en el padre estén disponibles en los hijos.
  • Para referenciar otro módulo, utiliza las mismas coordenadas y la versión ${project.version} para mantener sincronía.
  • Evita dependencias circulares; planifica el diagrama de responsabilidades para que las referencias sean claras.

9.4 Ejemplo de estructura multi-módulo (API + servicio + cliente)

Una plataforma empresarial puede separarse en módulos para API, lógica de negocio y cliente.

plataforma/
|-- pom.xml
|-- api/
|   |-- pom.xml
|   `-- src/
|-- servicio/
|   |-- pom.xml
|   `-- src/
`-- cliente/
    |-- pom.xml
    `-- src/
  • api expone contratos REST o definiciones de interfaces compartidas.
  • servicio implementa la lógica de negocio y depende del módulo api.
  • cliente consume la API y empaqueta la aplicación para usuarios finales.

Construir desde la carpeta padre con mvn clean install garantiza que los artefactos se generen en el orden correcto.

9.5 Buenas prácticas en proyectos empresariales con Maven

Para mantener proyectos grandes, aplica recomendaciones que faciliten la colaboración y la escalabilidad.

  • Centraliza versiones y plugins en el POM padre para evitar divergencias.
  • Define perfiles específicos por entorno que activen configuraciones solo cuando corresponda.
  • Implementa integración continua que compile todos los módulos y ejecute pruebas cruzadas.
  • Documenta la dependencia entre módulos y establece lineamientos de arquitectura para incorporar nuevos componentes.
  • Utiliza gestores de repositorios privados (Nexus o Artifactory) para publicar artefactos intermedios de forma segura.

Estas prácticas aseguran que el ecosistema multi-módulo siga siendo mantenible a medida que crece el equipo y la base de código.

Resumen didáctico

Los proyectos multi-módulo permiten dividir soluciones complejas en componentes especializados coordinados por un POM padre. Con una buena configuración de herencia, gestión de dependencias y disciplina en las relaciones entre módulos, es posible escalar plataformas empresariales sin perder consistencia.