当前位置: 首页 > news >正文

SpringBoot使用PropertiesLauncher加载外部jar包

Springboot启动入口源码

默认是org.springframework.boot.loader.JarLauncher

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader</artifactId>
</dependency>

启用SpringBoot的PropertiesLauncher

使用SpringBoot的PropertiesLauncher可以优先加载外部的jar文件, 这样可以在程序运行前替换jar包,
官方文档: Launching Executable Jars

使用演示

  1. 建立一个SpringBoot工程, 工程中依赖一个叫自定义的utils包, 版本是1.0.0, 通过http接口返回utils版本, 正常打包后访问, 返回1.0.0版本
@Slf4j
@RestController
public class HelloController {@RequestMapping("/version")public String version() {String version = VersionUtil.getVersion();log.info("请求version: " + version);return VersionUtil.getVersion();}@RequestMapping("spi-version")public Object spiVersion() {ArrayList<String> objects = new ArrayList<>();ServiceLoader<AgentInterface> load = ServiceLoader.load(AgentInterface.class);for (AgentInterface registry : load) {objects.add(registry.hello());}return objects;}@RequestMapping("/spring-res")public Object springRes() throws IOException {ArrayList<String> objects = new ArrayList<>();PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();Resource[] resources = pathMatchingResourcePatternResolver.getResources("classpath*:META-INF/services/com.example.utils.AgentInterface");for (Resource resource : resources) {objects.add(resource.toString());}return objects;}}
  1. 在启用应用程序时通过-Dloader.path=/libs指定外部jar的目录, 再启动, 访问接口返回2.0.0版本, 说明包替换成功

指定PropertiesLauncher启动类执行

java -cp demo1-0.0.1-SNAPSHOT.jar org.springframework.boot.loader.PropertiesLauncher

在这里插入图片描述

java -cp demo1-0.0.1-SNAPSHOT.jar -Dloader.path=/Users/admin/.m2/repository/com/example/utils/2.0.0/ org.springframework.boot.loader.PropertiesLauncher

在这里插入图片描述

访问java spi

可以正常只加载2.0.0版本中的实现类, 这个符合预期
在这里插入图片描述

访问资源文件

访问资源文件, 会发现本应只从2.0.0版本中加载文件, 结果1.0.0版本中的也被加载了
在这里插入图片描述

http://www.lryc.cn/news/103631.html

相关文章:

  • 骑行 - 出发前如何准备
  • ssm员工管理系统
  • 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者再识AutoResponder标签-上
  • Yolov8新版本解读:优化点如何加入新版本,通过加入EMA注意力进行对比说明
  • NoSQL———Redis配置与优化
  • js,瀑布流
  • “深入了解Spring Boot:从入门到精通“
  • 记录时间计算bug getDay()的一个坑
  • 【lesson5】linux vim介绍及使用
  • 【玩转Linux】Linux输入子系统简介
  • grid map学习笔记2之grid map的一些常规定义和功能包说明
  • Python-文件操作
  • windows中注册redis服务启动时报1067错误
  • 大数据面试题:HBase的RegionServer宕机以后怎么恢复的?
  • ansible的脚本——playbook剧本
  • 【系统监控程序】
  • 计算机论文中名词翻译和解释笔记
  • 读书笔记-《ON JAVA 中文版》-摘要20[第十九章 类型信息-1]
  • 3、Linux驱动开发:模块_传递参数
  • 基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码
  • 全面解析 SOCKS5 代理和 HTTP 代理在网络安全与爬虫应用中的技术对比与应用指南
  • DevOps系列文章 之 docker 制作kafka镜像
  • iPhone 安装 iOS 17公测版(Public Beta)
  • Spingboot yaml 配置文件及数据读取
  • vue中使用axios发送请求时,后端同一个session获取不到值
  • html请求谷歌音频跨域问题(谷歌翻译接口)虚拟机ping不通google(下载谷歌音频、下载百度翻译音频)
  • 【设计模式|结构型】享元模式(Flyweight Pattern)
  • 最小覆盖子串(JS)
  • <C语言> 预处理和宏
  • 代驾公司如何进行运营分析