首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编译具有不同控制器的同一个应用程序文件的多个jars

如何编译具有不同控制器的同一个应用程序文件的多个jars
EN

Stack Overflow用户
提问于 2020-04-20 11:04:40
回答 2查看 275关注 0票数 11

我正在用2个提供者编写一个weather服务,weather-1weather-2。我有两个Spring Controllercontroller-1controller-2,它们分别调用两个服务。

我的目的是在两个天气服务jars之间切换,比如如果我想从weather-1获取天气数据,那么controller-1必须使用weather-1.jar文件进行编译,而controller-2则保持不变。

我尝试了两个不同的Gradle文件,用于build-weather-1.gradlebuild-weather-2.gradle这样的服务。

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

build-weather-1.gradle

代码语言:javascript
复制
implementation 'com.xxx.weather:weather-1:0.0.1'

build-weather-2.gradle

代码语言:javascript
复制
implementation 'com.xxx.weather:weather-2:0.0.1'

我使用命令- gradle -b build-weather-1.gradle build运行了这个gradle -b build-weather-1.gradle build。不幸的是,这个构建文件也需要另一个服务类控制器。

代码语言:javascript
复制
error: package com.xxx.weather.weather-2 does not exist

我已经排除了下面的方案,

代码语言:javascript
复制
sourceSets {
 main {
 java {
 exclude 'com/xxxx/weatherservice/controller/Weather2Controller.java'
 }
    }
}

但是这个接口(weather-2)在Application.java文件中被声明为一个bean,它抛出包没有找到错误。

如何解决此错误?

EN

回答 2

Stack Overflow用户

发布于 2021-01-28 04:14:45

您可以考虑以下模式:

  1. 定义一个公共的WeatherService接口。
  2. 两个气象服务都实现了这个接口。
  3. 实现单个控制器,通过它的构造函数注入WeatherService的实现。

这是一个应用依赖反转原理的例子,来自固体原理

高级模块不应依赖于低级别模块。两者都应该依赖于抽象(例如,接口)。抽象不应依赖于细节。细节(具体的实现)应该取决于抽象。

在您的应用程序中,控制器(实现)依赖于WeatherService接口(抽象),而不是特定的气象服务实现。

完成上述操作后,有许多用于部署控制器的选项,这些控制器使用了所需的天气服务实现。其中包括:

  • 在您的main()方法中或使用您选择的依赖注入方法:构造所需的天气服务实现的实例,并使用该实例构造控制器。
  • 让每个天气服务实现一个插件,使用类似于PF4J的工具
  • 使用反射查找和构造放置在运行时类路径上的任何天气服务实现(假设您将每个天气服务实现编译为单独的JAR,以及包含WeatherService接口和控制器的核心JAR )。
票数 1
EN

Stack Overflow用户

发布于 2020-12-15 14:20:22

在我看来,如果您的项目需要彼此独立构建,您应该将它们作为单独的项目(在这种情况下,您仍然可以通过其他项目所依赖的第三个库项目共享一些代码)。

如果您仍然希望将它们保存在相同的gradle结构中,那么您应该查看这个指南中提到的多模块设置,并在其自己的build.gradle文件中为每个子模块保留一个构建配置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61320930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档