代码之家  ›  专栏  ›  技术社区  ›  Leonardo Leandro

找不到包(多模块spring项目)

  •  4
  • Leonardo Leandro  · 技术社区  · 6 年前

    Spring Initializr 要创建两个模块:

    (这是SpringWeb)

    分贝 (这是Spring数据MongoDB)

    mvn clean install 带有构建成功消息。没问题。

    但是,如果我尝试创建一个测试(或者甚至在 主要的 结构),其中它使用 mvn清洁安装

    结构是:

    api
    \- src/main/java
      \- com.example.api.controllers
        \- UserController.java
    \- src/test/java
      \- com.example.api.controllers
        \- UserControllerTest.java
    db
    \- src/main/java
      \- com.example.db.repositories
        \- UserRepository.java
    model
    \- src/main/java
      \- com.example.model
        \- User.java
    

    ApiApplication.java

    package com.example.api;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @SpringBootApplication
    public class ApiApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ApiApplication.class, args);
        }
    
    }
    

    UserController.java

    package com.example.api.controllers;
    
    import com.example.api.Constants;
    import com.example.db.repositories.UserRepository;
    import com.example.model.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
        @Autowired
        private UserRepository userRepository;
    
        @GetMapping(Constants.V1 + "user")
        public User getUser() {
            User user = new User("John");
            userRepository.save(user);
            return user;
        }
    }
    

    现在,如果我跑 mvn清洁安装 ,我将收到maven的错误声明 package com.example.db.repositories does not exist

    分贝 是模块中的依赖项 应用程序编程接口 应用程序编程接口 模块设置为在 在家长的pom中。

    父-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.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <modules>
            <module>model</module>
            <module>db</module>
            <module>api</module>
        </modules>
    
    </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">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.1.RELEASE</version>
            <relativePath/>
        </parent>
    
        <groupId>com.example</groupId>
        <artifactId>db</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>model</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
    </project>
    

    api-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>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>LATEST</version>
            <relativePath/>
        </parent>
    
        <groupId>com.example</groupId>
        <artifactId>api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>db</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    如何让maven看到这个包?

    使其找到包后出现新错误

    2019-01-14 19:16:55.060  WARN 31104 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.db.repositories.UserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    2019-01-14 19:16:55.066  INFO 31104 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
    2019-01-14 19:16:55.087  INFO 31104 --- [           main] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2019-01-14 19:16:55.224 ERROR 31104 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Field userRepository in com.example.api.controllers.UserController required a bean of type 'com.example.db.repositories.UserRepository' that could not be found.
    
    The injection point has the following annotations:
            - @org.springframework.beans.factory.annotation.Autowired(required=true)
    
    
    Action:
    
    Consider defining a bean of type 'com.example.db.repositories.UserRepository' in your configuration.
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   priyank-sriv    6 年前

    你正在(重新)包装 db 作为Spring引导的“应用程序”,而不是使用 spring-boot-maven-plugin

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    

    ,从而加入 com.example.db.repositories 包(及其类)在BOOT-INF文件夹中。这会导致编译失败。

    Boot-repackage

    <plugin>..</plugin> 离别 db/pom.xml api 单元

    Jar

    注:我假设 Main

        2
  •  4
  •   thst    6 年前

    Springboot自动发现将仅从您的配置类下降。你的申请在

    com.example.api
    

    com.example.db
    

    也可以将搜索路径添加到autodiscover.db,或者将应用程序类移动到com.example,或者将db代码移动到com.example.api

    @ComponentScan(“com.example”)
    @SpringBootApplication
    public class ExampleApplication  {
    

    选择2

    @ComponentScan({"com.example.api","com.example.db"})
    @SpringBootApplication
    public class ExampleApplication {
    

    您还可以将scanBasePackages属性添加到SpringbootApplication注释中,以获得相同的效果。

    @SpringBootApplication(scanBasePackages= {"com.example.api","com.example.db"})
    public class ExampleApplication {
    

    https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html#scanBasePackages--

        3
  •  0
  •   Grim    6 年前

    实际上,API必须看到DB类。

    确保:

    1. 父项目为打包类型 pom ( <packaging>pom</packaging>
    2. 附属国 与数据库的版本相同