Volver a la página principal
sábado 8 febrero 2025
24

Cómo organizar módulos en Spring Boot

En Spring Boot, puedes organizar tu proyecto en múltiples módulos usando Maven para mejorar la mantenibilidad y escalabilidad del código. Esto es útil cuando tienes un sistema con varias funcionalidades que pueden desarrollarse y desplegarse de manera independiente.

📌 Pasos para trabajar con módulos en Maven y Spring Boot

1️⃣ Crear un Proyecto Padre con Maven

El proyecto padre agrupa todos los módulos y define configuraciones compartidas.

mvn archetype:generate -DgroupId=com.miapp -DartifactId=miapp-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Dentro de miapp-parent/pom.xml, configúralo como un proyecto padre sin empaquetado específico:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.miapp</groupId>
    <artifactId>miapp-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>miapp-core</module>
        <module>miapp-service</module>
        <module>miapp-web</module>
    </modules>

    <properties>
        <java.version>17</java.version>
        <spring-boot.version>3.2.1</spring-boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

2️⃣ Crear los módulos

📁 Estructura del proyecto:

miapp-parent/
│── pom.xml (proyecto padre)
│── miapp-core/
│   ├── pom.xml
│   ├── src/main/java/com/miapp/core/
│── miapp-service/
│   ├── pom.xml
│   ├── src/main/java/com/miapp/service/
│── miapp-web/
    ├── pom.xml
    ├── src/main/java/com/miapp/web/

Crea cada módulo con:

mvn archetype:generate -DgroupId=com.miapp -DartifactId=miapp-core -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate -DgroupId=com.miapp -DartifactId=miapp-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate -DgroupId=com.miapp -DartifactId=miapp-web -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

3️⃣ Configurar POMs de cada módulo

🔹 miapp-core/pom.xml (Capa de datos y entidades)

<project>
    <parent>
        <groupId>com.miapp</groupId>
        <artifactId>miapp-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>miapp-core</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>
</project>

🔹 miapp-service/pom.xml (Servicios y lógica de negocio)

<project>
    <parent>
        <groupId>com.miapp</groupId>
        <artifactId>miapp-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>miapp-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.miapp</groupId>
            <artifactId>miapp-core</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

🔹 miapp-web/pom.xml (Capa REST y API)

<project>
    <parent>
        <groupId>com.miapp</groupId>
        <artifactId>miapp-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>miapp-web</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.miapp</groupId>
            <artifactId>miapp-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

4️⃣ Ejemplo de Clases

📌 Capa Core (miapp-core)

package com.miapp.core.model;

import jakarta.persistence.*;

@Entity
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nombre;
}

📌 Capa Service (miapp-service)

package com.miapp.service;

import com.miapp.core.model.Usuario;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UsuarioService {
    public List<Usuario> obtenerUsuarios() {
        return List.of(new Usuario());
    }
}

📌 Capa Web (miapp-web)

package com.miapp.web;

import com.miapp.service.UsuarioService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/usuarios")
public class UsuarioController {
    private final UsuarioService usuarioService;

    public UsuarioController(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }

    @GetMapping
    public List<Usuario> listarUsuarios() {
        return usuarioService.obtenerUsuarios();
    }
}

5️⃣ Construcción y Ejecución

Compila todo el proyecto con:

mvn clean install

Ejecuta la aplicación desde miapp-web:

cd miapp-web
mvn spring-boot:run

6️⃣ Ventajas del Uso de Módulos en Spring Boot con Maven

Reutilización de código: Se pueden usar módulos en distintos proyectos.

Separación de responsabilidades: Facilita la organización de lógica, API y base de datos.

Desarrollo independiente: Diferentes equipos pueden trabajar en módulos separados.

Reducción de dependencias en cada módulo, mejorando tiempos de compilación.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer