SpringBoot ComponentScan与多模块项目有关

时间:2015-06-02 04:31:46

标签: java spring spring-boot

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

myapp-core模块中的所有类都位于root包 com.myapp.core 中,myapp-web模块中的所有类都位于root包 com.myapp.web

主要的Application.java也在com.myapp.web包中。由于我的核心模块根包不同,我将为ComponentScan包含共同基础包" com.myapp" ,如下所示:

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

现在令人惊讶的是,如果我使用运行方式 - >运行此应用程序Spring Boot App 它工作正常。但如果我将其作为运行方式 - >运行Java应用程序它失败了,错误地说它无法在myapp-core模块中找到bean。

如果我将Application.java移动到com.myapp包,它就可以了。 它应该工作,即使我也将它作为Java应用程序运行,对吗?

3 个答案:

答案 0 :(得分:14)

启用spring的调试日志级别并浏览大量日志后,我发现扫描各种组件(如JPA存储库,JPA实体等)取决于Application.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);
    }
}

使用上述额外@EnableJpaRepositories@EntityScan我可以使用运行方式 - >运行它Java应用程序

但是当运行为 - >时仍不确定它是如何正常工作的Spring Boot App !!

无论如何,我认为最好将我的Application.java移到com.myapp包,而不是与SpringBoot打架!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我在Redis存储库中遇到了类似的问题,该问题以类似的方式解决:


@Configuration
@EnableConfigurationProperties({RedisProperties.class})
@RequiredArgsConstructor
@EnableRedisRepositories(basePackages = {"com.example.another"})
public class RedisConfig {

    private final RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
        template.setConnectionFactory(redisConnectionFactory);
        template.afterPropertiesSet();
        return template;
    }
}