SpringBoot Component多模块项目的扫描问题

2022-09-04 01:21:02

我有一个myapp父pom类型的maven项目,其中包含myapp-core和myapp-web模块。myapp-core模块作为依赖项添加到myapp-web中。

myapp-core 模块中的所有类都驻留在 root package com.myapp.core 中,myapp-web 模块中的所有类都驻留在 root package com.myapp.web

主要的 Application.java 也位于 com.myapp.web 包中。由于我的核心模块根包不同,我为Consentscan包含了通用的基础包“com.myapp”,如下所示:

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

现在令人惊讶的是,如果我使用运行方式->Spring Boot应用程序运行此应用程序,它工作正常。但是,如果我以运行方式运行>Java应用程序,它会失败并出现错误,说它找不到myapp-core模块中定义的bean。

如果我移动到包装,它工作正常。即使我也将其作为Java应用程序运行,它也应该工作,对吧?Application.javacom.myapp


答案 1

在为spring启用调试日志级别并浏览大量日志后,我发现扫描各种组件(如JPA存储库,JPA实体等)取决于应用程序.java的软件包名称。

如果 JPA 存储库或实体不在 的包的子包中,那么我们需要显式指定它们,如下所示:Application.java

@Configuration
@ComponentScan(basePackages="com.sivalabs.jcart")
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages="com.sivalabs.jcart")
@EntityScan(basePackages="com.sivalabs.jcart")
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

有了上面的附加功能,我可以使用运行方式->Java应用程序来运行它。@EnableJpaRepositories@EntityScan

但仍然不确定当运行方式时它是如何工作的 - >春季启动应用程序

无论如何,我认为最好将我的包装移动到包装上,而不是与SpringBoot战斗!Application.javacom.myapp


答案 2

我有同样的问题。仅添加@EnableJpaRepositories注释即可解决问题。我试图在@SpringBootApplication定义basePackages,但无济于事。我认为 Application 类的包被提供给 JpaRepositories 的扫描过程,但@SpringBootApplication中定义的其他包被忽略了。它看起来像Spring Boot的一个错误/改进。


推荐