使用Spring Boot和多个模块的Maven配置 – 在Intellij中运行应用程序

我目前正在使用Spring Boot开发REST API。

我是Maven的新手,刚开始使用IDEA编码(还不熟悉这个IDE),我有一个问题……

这是我的项目结构:

    • 的pom.xml
    • 主要模块
      • 调节器
      • App.java(Spring Boot主类)
      • 的pom.xml
    • 子模块(需要主模块作为依赖)
      • 控制器
      • 的pom.xml

因此,当我在Intellij中运行项目时,它会启动,我可以访问主模块控制器中定义的所有URL。 但不是子模块控制器中的那些……看起来只有主模块被加载了。

这是我的父pom.xml:

  org.springframework.boot spring-boot-starter-parent 1.2.1.RELEASE  4.0.0 Test :: Test :: Parent POM test.test.test project-parent 0.0.1-SNAPSHOT pom   1.8 1.8  1.2.1.RELEASE  2.5 java jacoco reuseReports ${project.basedir}/../target/jacoco.exec  2.18.1 0.7.3.201502191951 UTF-8 UTF-8   submodule main      org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version}  true  **/*Test.java **/*IT.java **/*Story.java        org.jacoco jacoco-maven-plugin ${jacoco-maven-plugin.version}  ${project.basedir}/../target/jacoco.exec     prepare-agent      org.codehaus.mojo sonar-maven-plugin ${sonar-maven-plugin.version}     

这里是我的主要模块pom.xml:

   project-parent test.test.test 0.0.1-SNAPSHOT  4.0.0 main Test :: Test :: Main  UTF-8 3.3.2 1.10 3.0.0  4.3.6 3.9.5 1.7.1    org.springframework.boot spring-boot-starter-data-rest   org.springframework.boot spring-boot-starter-data-jpa   org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-security   com.google.code.findbugs jsr305 ${jsr305.version}   org.apache.commons commons-lang3 ${commons-lang3.version}   commons-codec commons-codec ${commons-codec.version}    com.h2database h2   postgresql postgresql 9.1-901-1.jdbc4   org.apache.httpcomponents httpclient ${http-commons.version} test   org.apache.httpcomponents fluent-hc ${http-commons.version} test   org.springframework.boot spring-boot-starter-test test   org.springframework.data spring-data-commons   org.jbehave jbehave-spring ${jbehave.version} test   org.assertj assertj-core ${assertj.version}       org.springframework.boot spring-boot-maven-plugin     

这里是子模块pom.xml:

   project-parent test.test.test 0.0.1-SNAPSHOT  4.0.0 submodule Test :: Test :: Submodule  UTF-8 3.3.2 1.10 3.0.0  4.3.6 3.9.5 1.7.1    test.test.test main 0.0.1-SNAPSHOT    

我认为这是正确的,但不确定…我使用配置在Maven中运行Intellij中的项目:

  • 工作目录是root(不是子模块)
  • 命令行mvn spring-boot:run -Drun.arguments=--spring.profiles.active=dev -e -pl main
  • 带有parent.main.App的属性start-class

需要你的帮助配置所有的东西来运行Spring Boot与IDE中加载的所有子模块用于开发目的…因为我只是不知道我的配置有什么问题!

谢谢 !

您需要告诉SpringBoot在哪里寻找您的控制器。 默认情况下,只发生在@SpringBootApplication类的子包中(可能不包括子模块)。

为了更改它,您可以使用@ComponentScan("path.to.package")来更改默认包。

此外,您可以使用@EntityScan对可能位于子模块中的@Entity类执行相同操作。

您的项目结构如下:

    • 的pom.xml
    • 主要模块
      • 调节器
      • App.java(Spring Boot主类)
      • pom.xml(将子模块作为依赖项添加到主模块)
    • 子模块
      • 控制器
      • pom.xm

如果你的App.java在一个包中: com.xxxx.pro ,那么设置子模块的包是com.xxx.pro ,比如你的子模块的控制器是TestController.java,代码是:

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

所以,这个sub moudle的TestController将由App.java进行修复。试试吧,祝你好运。

还要注意,如果JPA实体和存储库不在Application.java包的子包中,那么@Entityscan和@EnableJpaRepositories必须在Application类中声明,例如:

 @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); } }