【问题标题】:How can I exclude Spring beans scanned from a project's dependency?如何排除从项目依赖项中扫描的 Spring bean?
【发布时间】:2019-03-21 01:54:00
【问题描述】:

我有一个基于 Gradle 的项目,其中包含两个模块 mod1mod2。两者都是 Spring Boot 项目。 mod1 具有 mod2 作为依赖项:

dependencies {
    compile project(':mod2')
    //more deps
}

mod1mod2 类的基包都是 com.project。在mod2中,我在com.project.controllers下有一些Spring MVC控制器,所以当我启动mod1时,mod2控制器注册在Spring上下文中。

我想避免这种情况。

我尝试使用@SpringBootApplicationexclude 参数排除它们,但它不起作用(因为它们在另一个模块/依赖项中,而不是在项目本身中,我猜)。

是否可以通过 Gradle 配置以某种方式排除 mod2com.project.controllers 包?

【问题讨论】:

    标签: spring-boot gradle build.gradle dependency-management


    【解决方案1】:

    据我所知不可能。 Gradle 将mod2 视为一个依赖项,因此它会引入所有内容,包括它的任何依赖项,具体取决于您在mod2build.gradle 文件中声明它们的方式。

    由于它们是同一个包的一部分,它们将被 Spring 自动拾取,据我所知,从自动扫描中排除单个组件的唯一方法是明确指定要排除的组件excludeFilters:

    excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {MyController.class, MyOtherController})
    

    否则,您需要将这些特定控制器声明为单独的依赖项,当您拉入 mod2 时可以将其排除在外:

    build.gradlem2

    dependencies {
        compile project(':mod2') {
            exclude 'controllers'
        }
    }
    

    build.gradlem1

    dependencies {
        compile project(':controllers')
    }
    

    类似的东西。我不是 Gradle 专家,因此请参阅文档:

    【讨论】:

    • 谢谢。你知道@SpringBootApplication的“exclude”参数和@ComponentScan的“excludeFilters”的区别吗?我已经尝试了第一个,但它不起作用。关于创建另一个“控制器”模块,我不可能这样做,但还是谢谢你。
    猜你喜欢
    • 2017-11-11
    • 2022-12-07
    • 2018-10-18
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2018-02-11
    相关资源
    最近更新 更多