添加 maven 依赖项以另一个为条件



我有几个项目依赖于一个通用框架,建立在Spring Boot之上。这个框架通过BeanPostProcessor和类似的Spring机制自动配置应用程序使用的许多东西。

它还添加了对应用程序可以使用的可选库的支持,使用@Conditionalbean 和可选的 Maven 依赖项。

我面临的问题是其中一个可选库是 Resilience4J,如果添加了 Resilience4j,我想添加对resilience4j-micrometer的依赖,这样我就可以通过千分尺公开开箱即用的所有 Resilience4J 指标。

Maven 中是否有任何机制允许在给定某些条件的情况下添加条件依赖项,因此我确保每个使用 Resilience4J 的应用程序都公开其指标?

PS:我试图创建一个模块来包装依赖项,但是应用程序使用不同的 Resilience4J 依赖项(有些应用程序是 web,有些是 Webflux,有些使用 Spring Cloud 抽象,有些则没有......

您可以尝试通过 maven 配置文件管理依赖项,但这并不是最好的方法。您的框架应该集成所有库,并且您的应用程序使用排除项管理依赖项,以便 Spring Boot 只能自动配置包含的依赖项。

我不确定我是否在关注您的问题,我假设您有一个"通用"库。 所以你有一个应用程序A(弹簧启动驱动(,在其pom中.xml你添加了对"common"的依赖。如果 A 依赖于 Resilience4J,您希望在 A 的应用程序上下文中创建 Beans。这些豆子应该增加一些与千分尺相关的东西。

在这种情况下,您可以使用 ConditionalOnClass:

在"common"的代码中,你可以有这样的东西:

@Configuration
@ConditionalOnClass(Resilience4j.class) // or whatever class that can indicate that resilience4j is in the classpath, I took this for the sake of example, I don't know whether this class really exists
public class CommonConfiguration {
@Bean
public YourMicrometerIntegrationBean yourMicrometerIntegrationBean() {
return new YourMicrometerIntegrationBean();
}
.. other beans ..
}

此解决方案假设您在 resilience4j 的"公共"中具有 maven 级别的依赖关系(可选 ?(。如果您出于某种原因不希望这样做,您可以创建自定义条件(我相信您知道如何根据您在问题中提供的详细信息来执行此操作,您有一个非常高级的设置,如果您需要更多详细信息,请告诉我(,如果Class.forName(<FULLY_QUALIFIED_NAME_OF_RESILIENCE_4_J>)不会抛出异常,则此自定义条件的评估结果为"true",以便您会看到它在运行时可用。

最新更新