我正在使用2个提供者weatherweather-1编写weather-2服务。我有两个Spring Controllercontroller-1controller-2分别调用这两个服务。

我的意图是在两个气象服务 jar 之间切换,例如,如果我想从weather-1获取气象数据,则controller-1必须与weather-1.jar文件一起编译,而controller-2保持不变。

我已经尝试使用两种不同的Gradle文件来提供两种服务,例如build-weather-1.gradlebuild-weather-2.gradle

两者都将具有自己的jar依赖项。

build-weather-1.gradle

implementation 'com.xxx.weather:weather-1:0.0.1'

build-weather-2.gradle
implementation 'com.xxx.weather:weather-2:0.0.1'

我使用命令build-weather-1.gradle运行了gradle -b build-weather-1.gradle build。不幸的是,该构建文件也需要其他服务类 Controller 。
error: package com.xxx.weather.weather-2 does not exist

我已排除了以下包装,
sourceSets {
 main {
 java {
 exclude 'com/xxxx/weatherservice/controller/Weather2Controller.java'
 }
    }
}

但是,此接口(interface)(weather-2)在Application.java文件中声明为Bean,这引发未找到包错误。

如何解决这个错误?

最佳答案

您可以考虑以下模式:

  • 定义通用的WeatherService接口(interface)。
  • 两种天气服务都实现此接口(interface)。
  • 实现一个 Controller ,通过其构造函数注入(inject)WeatherService的实现。

  • 这是从SOLID principles应用依赖反转原理的示例:

    在您的应用程序中, Controller (实现)取决于WeatherService接口(interface)(抽象),而不是特定的天气服务实现。
    完成上述操作后,将有许多用于部署 Controller 的选项,这些 Controller 可以利用所需的气象服务实现方案。这些包括:
  • main()方法中或使用选择的依赖项注入(inject)方法:构造所需气象服务实现的实例,并使用该实例构造 Controller 。
  • 使用PF4J
  • 之类的东西,使每个气象服务实现都成为一个插件。
  • 使用反射来查找和构造已放置在运行时类路径上的任何天气服务实现(假定除了包含WeatherService接口(interface)和 Controller 的核心JAR之外,将每个天气服务实现编译为单独的JAR)。
  • 关于java - 如何通过不同的 Controller 编译使用同一应用程序文件的多个jar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61320930/

    10-11 01:48