簡體   English   中英

如何編譯多個 jars 使用不同控制器的相同應用程序文件

[英]How to compile multiple jars that uses same application file with different controllers

我正在使用 2 個提供者weather-1weather-2編寫weather服務。 我有兩個Spring Controllercontroller-1controller-2分別調用這兩個服務。

我的意圖是在兩個氣象服務 jars 之間切換,就像如果我想從weather-1獲取氣象數據,那么controller-1必須使用weather-1.jar文件進行編譯,而controller-2保持不變。

我已經為build-weather-1.gradlebuild-weather-2.gradle等服務嘗試了兩個不同的Gradle文件。

兩者都將擁有自己的jar依賴項。

構建天氣 1.gradle

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

構建天氣 2.gradle

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

我使用命令運行build-weather-1.gradle - gradle -b build-weather-1.gradle build 不幸的是,這個構建文件也需要其他服務 class controller。

error: package com.xxx.weather.weather-2 does not exist

我已經排除了 package 如下,

sourceSets {
 main {
 java {
 exclude 'com/xxxx/weatherservice/controller/Weather2Controller.java'
 }
    }
}

但是這個接口( weather-2 )在 Application.java 文件中被聲明為一個 bean,它會拋出 package not found 錯誤。

如何解決此錯誤?

您可以考慮以下模式:

  1. 定義一個通用的WeatherService接口。
  2. 兩個天氣服務都實現了這個接口。
  3. 實現單個 controller,通過其構造函數注入WeatherService的實現。

這是一個應用依賴倒置原則的例子,來自SOLID 原則

高級模塊不應該依賴於低級模塊。 兩者都應該依賴於抽象(例如,接口)。 抽象不應該依賴於細節。 細節(具體實現)應該依賴於抽象。

在您的應用程序中,controller(實現)依賴於WeatherService接口(抽象),而不是特定的天氣服務實現。

完成上述操作后,有許多選項可用於部署使用所需天氣服務實現的控制器。 這些包括:

  • 在您的main()方法中或使用您選擇的依賴注入方法:構建所需天氣服務實現的實例,並使用該實例構建您的 controller。
  • 使用PF4J 之類的東西使每個天氣服務實現成為一個插件
  • 使用反射來查找和構造已放置在運行時類路徑中的任何天氣服務實現(假設您將每個天氣服務實現編譯為單獨的 JAR,以及包含WeatherService接口和控制器的核心 JAR)。

在我看來,如果您的項目需要彼此獨立構建,您應該將它們作為單獨的項目保留(在這種情況下,您仍然可以通過其他項目可能依賴的第三個庫項目共享一些代碼)。

如果您仍然希望將它們保留在相同的 gradle 結構中,您應該查看本指南中提到的多模塊設置,並將每個子模塊的構建配置保留在其自己的 build.gradle 文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM