SpringBoot没有';在多模块Java应用程序中,无法从另一个模块识别RestController

SpringBoot没有';在多模块Java应用程序中,无法从另一个模块识别RestController,java,maven,intellij-idea,spring-boot,multi-module,Java,Maven,Intellij Idea,Spring Boot,Multi Module,我已经花了相当长的时间,但我无法克服这个(配置)问题 <?xml version="1.0" encoding="UTF-8"?> <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.

我已经花了相当长的时间,但我无法克服这个(配置)问题

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <parent>
        <artifactId>Greeter</artifactId>
        <groupId>com.bet.jbs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>core</artifactId>

</project>
技术堆栈:Java(1.8)、Springboot(starter父代、starter web)、Maven、IntelliJ IDEA

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <parent>
        <artifactId>Greeter</artifactId>
        <groupId>com.bet.jbs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>core</artifactId>

</project>
说明:尝试创建一个由(最初)两个模块组成的多模块Java应用程序:

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <parent>
        <artifactId>Greeter</artifactId>
        <groupId>com.bet.jbs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>core</artifactId>

</project>
  • 核心模块:主模块(主业务逻辑,每个其他模块都应该通过此模块查看和交互)。此模块包含主应用程序类
  • webgateway模块:简单的Rest控制器,将映射请求并调用核心模块
  • 问题:Springboot在发送http请求时未从webgateway模块加载/扫描RestController=>404错误

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    Github回购协议

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    项目配置:

    Greeter 
       |
       + pom.xml (parent pom)
       |
       + -- core                                            
       |     |
       |     + ...
       |     |
       |     + pom.xml
       |
       + -- webgateway 
             |
             + ...
             |
             + pom.xml (depends on core pom.xml)
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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.bet.jbs</groupId>
        <artifactId>Greeter</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <modules>
            <module>core</module>
            <module>webgateway</module>
        </modules>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </project>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    父pom.xml:

    Greeter 
       |
       + pom.xml (parent pom)
       |
       + -- core                                            
       |     |
       |     + ...
       |     |
       |     + pom.xml
       |
       + -- webgateway 
             |
             + ...
             |
             + pom.xml (depends on core pom.xml)
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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.bet.jbs</groupId>
        <artifactId>Greeter</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <modules>
            <module>core</module>
            <module>webgateway</module>
        </modules>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </project>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    欢迎控制器来自网络网关模块的课程:

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    package com.bet.jbs.webgateway.controller;
    
    import com.bet.jbs.core.util.GreetingGenerator;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        @RequestMapping(value = "/webgreeting", method = RequestMethod.GET)
        public String getGreeting() {
            return "WEBGATEWAY module says " + GreetingGenerator.getRandomGreeting();
        }
    }
    
    为了测试相同的REST控制器如果位于核心模块中是否可以正常工作,我在核心模块中也创建了一个类似的GreetingController类(这一类可以正常工作):

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    

    Spring Boot主应用程序位于
    核心
    模块中,该模块不依赖于
    webgateway
    模块。因此,带有控制器的类在运行时将不存在,并且不能被spring发现

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    Fix:将依赖项添加到
    webgateway
    核心,或将启动器/主类移动到
    webgateway
    模块

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    

    您还可以使用第三个模块进行启动,该模块依赖于
    core
    webgateway

    自从上一天以来,我一直被困在这个问题中。。。下面的解决方案肯定会为您节省大量时间

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    我是这样解决的:

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
  • 为主
    应用程序
    类创建单独的模块

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    x服务

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
    • pom.xml(父级)
    • child1模块
      • pom.xml
    • 儿童2模块
      • pom.xml
    • 应用程序模块
      • xml(包含child1和child2的依赖项)
      • src/main/java/Application.java
  • 将所有模块作为依赖项添加到具有应用程序类的模块的pom中

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
     <?xml version="1.0" encoding="UTF-8"?>
     <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">
     <parent>
         <artifactId>x-service</artifactId>
         <groupId>com.a.b.c</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
    
     <artifactId>app-module</artifactId>
    
     <dependencies>
         <dependency>
             <groupId>com.a.b.cs</groupId>
             <artifactId>child1-module</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>com.a.b.cs</groupId>
             <artifactId>child1-module</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
     </dependencies>
    
     <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
             </resource>
         </resources>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <configuration>
                     <executable>true</executable>
                 </configuration>
             </plugin>
         </plugins>
     </build>
    
    
    

    我添加了正确的依赖项,Spring Boot仍然找不到我的新控制器。似乎IntelliJ IDEA(2020.3.2)或Maven(3.3.6)在添加模块时没有正确更新。这为我解决了问题:

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
  • 马文: 在父项目上清除并安装

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    
  • 在IntelliJ中,从文件菜单
    使缓存无效/重新启动..

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <parent>
            <artifactId>Greeter</artifactId>
            <groupId>com.bet.jbs</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>core</artifactId>
    
    </project>
    

  • 已经具有来自webgateway->core的依赖项。添加一个反向的将抛出(模块周期不支持注释处理)。此外,核心不应依赖于特定的网关。我们可以使用另一个网关(例如LAN TCP/IP)部署该项目。我将尝试第三个模块的选项。实际上,您应该避免循环。当我建议使用第三个模块来获得干净的依赖关系时,我就想到了这一点,但没有正确地解释这一点。有一个完整的模块只是为了启动应用程序,这有点困难(似乎有点过分),但是如果没有其他优雅的方法来解决这个问题,我可以接受。谢谢你的反馈。很高兴听到它成功了。关于这种奇怪的感觉:我倾向于从单个模块项目开始,尤其是在使用SpringBoot时。如果它变得太大,我会尝试将它分成多个独立的应用程序。如果有共同的功能,你可以提取一个核心模块。@JuanMonsalve我也有这个问题。通过两个步骤将其修复:1)maven:clean+在父项目上安装。2.)IntelliJ=>文件=>使缓存无效/重新启动。