java - 如何用不同的 Controller 编译使用相同应用程序文件的多个 jar

标签 java spring-boot gradle build

我正在写 weather与 2 个供应商的服务 weather-1weather-2 .我有两个 Spring Controller类(class) controller-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,它会抛出 package not found 错误。

如何解决此错误?

最佳答案

您可以考虑以下模式:

  • 定义一个共同的WeatherService界面。
  • 两个天气服务都实现了这个接口(interface)。
  • 实现单个控​​制器,注入(inject) WeatherService 的实现通过它的构造函数。

  • 这是一个应用依赖倒置原则的例子,来自 SOLID principles :

    High-level modules should not depend on low-level modules. Both should depend on abstractions (e.g., interfaces). Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.


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

    相关文章:

    java - 覆盖 gradle 中的 Spring Starter Version 版本

    android - Android Studio中缺少与Gradle图标同步项目

    java - 可以以编程方式退出简单的等待情况吗?

    Java 应用程序在 Mac 和 Windows 上运行自己的 JVM

    spring-boot - 带有bootRun且未优化启动的Spring Boot应用程序(kotlin,gradle)中的性能低下= false

    java - 不允许解析依赖配置 'implementation',因为它被定义为 'canBeResolved=false'

    android - 在年级构建中有不同的依赖性?

    java - 如何将 S3ObjectInputStream 转换为 PushbackInputStream

    java - Eclipse CDT解析C/C++头文件返回空AST

    java - JPA 选择查询返回带有 @ManyToOne 映射的实体