在运行时覆盖SpringBootJar类

时间:2019-10-15 13:06:43

标签: java spring-boot gradle

我正在使用一个系统在其中创建SpringBoot微服务。该微服务将通过SystemAdapter接口与外部系统通信。我们正在创建一个API,供人们构建自己的系统适配器。我正在寻找一种启动微服务的方法-在classPath中传递一个jar,并使其使用SystemAdapater的实现,而不是嵌入jar中的默认实现。

是否可以直接使用Gradle和bootJar的{​​{1}}任务来做到这一点。

我尝试采用的一种方法是:

SpringBoot

我试图写出2个不同的Jars,但我没得到

bootJar { exclude '**/adapters/**' } task saJar(type: Jar) { from sourceSets.main.output include '**/adapters/**' baseName 'SA' } bootJar.dependsOn(saJar) 才能正常工作

感谢您能提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

看看spring boot properties launcher,它将使您能够干净地加载外部SystemAdapter实现。
启用PropertiesLauncher:
1.在主应用中,将应用布局设置为ZIP

  

springBoot {           mainClass =“ ...”           布局=“邮政编码”           ...}

  1. 在实施捆绑包中,将布局设置为MODULE
  

springBoot {           mainClass =“ ...”           布局=“模块”           ...       }

  1. 添加以下cli指向外部jar所在的文件夹。
  

java -Dloader.path = file:/ path / to / SystemAdaptery-implementations-folder   -jar main-app.jar

那是用于加载实现的,您可以将其与spring boot的ServiceLoader(或简单地是jdk服务加载器)耦合,以注册SystemAdaptery实现实例并管理其调用。

答案 1 :(得分:0)

在Spring上下文中,您可以有许多实现SystemAdapter接口的bean,您只需要确保将它们注入到List字段中即可即可。

 List<SystemAdapter> systemAdapters;

然后您的代码只需要弄清楚应该使用这些bean中的哪个。