tutorial proyecto plugin para intellij initializr idea framework crear configurar community java maven intellij-idea module spring-boot

java - proyecto - Configuración de Maven con Spring Boot y módulos múltiples: ejecutar la aplicación en Intellij



spring framework tutorial intellij (3)

Actualmente estoy trabajando en una API REST con Spring Boot.

Soy nuevo en Maven y acabo de empezar a codificar con IDEA (aún no conozco bien este IDE), y tengo un problema ...

Aquí está mi estructura de proyecto:

  • padre
    • pom.xml
    • módulo principal
      • controlador
      • dominio
      • App.java (clase principal de Spring Boot)
      • pom.xml
    • submódulo (necesita módulo principal como dependencia)
      • controladores
      • dominio
      • pom.xml

Entonces cuando ejecuto el proyecto en Intellij, comienza, y puedo acceder a todas las URL definidas en el controlador del módulo principal. Pero no los que están en el controlador del módulo secundario ... Parece que solo se cargó el módulo principal.

Aquí está mi padre pom.xml:

<project> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.1.RELEASE</version> </parent> <modelVersion>4.0.0</modelVersion> <name>Test :: Test :: Parent POM</name> <groupId>test.test.test</groupId> <artifactId>project-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <properties> <!-- Specify Java Compiler Version --> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- Spring --> <spring-boot.version>1.2.1.RELEASE</spring-boot.version> <!-- Sonar --> <sonar-maven-plugin.version>2.5</sonar-maven-plugin.version> <sonar.language>java</sonar.language> <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin> <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath> <!-- Plugin --> <maven-surefire-plugin.version>2.18.1</maven-surefire-plugin.version> <jacoco-maven-plugin.version>0.7.3.201502191951</jacoco-maven-plugin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <modules> <module>submodule</module> <module>main</module> </modules> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> <configuration> <redirectTestOutputToFile>true</redirectTestOutputToFile> <includes> <include>**/*Test.java</include> <include>**/*IT.java</include> <include>**/*Story.java</include> </includes> </configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco-maven-plugin.version}</version> <configuration> <destFile>${project.basedir}/../target/jacoco.exec</destFile> </configuration> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>${sonar-maven-plugin.version}</version> </plugin> </plugins> </build> </project>

Aquí mi módulo principal pom.xml:

<project> <parent> <artifactId>project-parent</artifactId> <groupId>test.test.test</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>main</artifactId> <name>Test :: Test :: Main</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-codec.version>1.10</commons-codec.version> <jsr305.version>3.0.0</jsr305.version> <!-- Testing dependencies --> <http-commons.version>4.3.6</http-commons.version> <jbehave.version>3.9.5</jbehave.version> <assertj.version>1.7.1</assertj.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>${jsr305.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commons-codec.version}</version> </dependency> <!-- Test dependencies --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901-1.jdbc4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${http-commons.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>fluent-hc</artifactId> <version>${http-commons.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> </dependency> <dependency> <groupId>org.jbehave</groupId> <artifactId>jbehave-spring</artifactId> <version>${jbehave.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>${assertj.version}</version> </dependency> </dependencies> <!-- Package as an executable jar --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

Y aquí el submódulo pom.xml:

<project> <parent> <artifactId>project-parent</artifactId> <groupId>test.test.test</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>submodule</artifactId> <name>Test :: Test :: Submodule</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-codec.version>1.10</commons-codec.version> <jsr305.version>3.0.0</jsr305.version> <!-- Testing dependencies --> <http-commons.version>4.3.6</http-commons.version> <jbehave.version>3.9.5</jbehave.version> <assertj.version>1.7.1</assertj.version> </properties> <dependencies> <dependency> <groupId>test.test.test</groupId> <artifactId>main</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>

Creo que es correcto, pero no estoy seguro ... Ejecuto el proyecto en Intellij con Maven con config:

  • el directorio de trabajo es root (no submódulo)
  • línea de comando mvn spring-boot:run -Drun.arguments=--spring.profiles.active=dev -e -pl main
  • propiedad start-class con parent.main.App

Necesito tu ayuda para configurar todo eso para ejecutar Spring Boot con todos los submódulos cargados en el IDE para el desarrollo ... porque ¡no sé lo que está mal en mi configuración!

Gracias !


Debe indicarle a SpringBoot dónde buscar sus controladores. Por defecto que solo ocurre en @SpringBootApplication de su clase @SpringBootApplication (que probablemente no incluya su submódulo).

Para cambiar esto, puede usar @ComponentScan("path.to.package") para cambiar el paquete predeterminado.

Además, puede usar @EntityScan para hacer lo mismo con @Entity clases @Entity que podrían estar en su submódulo.


Su proyecto estructurado como:

  • padre
    • pom.xml
    • módulo principal
      • controlador
      • dominio
      • App.java (clase principal de Spring Boot)
      • pom.xml (agrega submódulo al módulo principal como dependencia)
    • submódulo
      • controladores
      • dominio
      • pom.xm

si su App.java en un paquete: com.xxxx.pro , entonces configure el paquete del submódulo es com.xxx.pro , como el controlador de su submódulo es TestController.java, y el código es:

package com.xx.pro.web; @RestController public class TestController{ }

entonces, este TestController de submoudle será sanado por App.java. Pruébalo, buena suerte.


También tenga en cuenta que, en el caso de que las entidades JPA y los repositorios no estén en subpaquetes del paquete de Application.java, entonces @Entityscan y @EnableJpaRepositories DEBEN declararse en la clase Application, por ejemplo:

@Configuration @ComponentScan(basePackages="com.my.pack") @EnableAutoConfiguration @EnableJpaRepositories(basePackages="com.my.pack") @EntityScan(basePackages="com.my.pack") public class Application{ public static void main(String[] args) { SpringApplication.run(Application.class, args); } }