实现SpringBoot的jar包嵌入其他项目
发布于2021-12-08 00:38:02,更新于2021-12-16 23:32:29,标签:java open 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog我手里有个日志监控功能,而我手里又有很多套项目,我都想加上这个日志监控功能,又不想每个项目都写一遍,怎么办呢?
于是便想到了,将项目打成jar包嵌入到其他项目里,别的项目就可以复用里面的接口、静态资源。
步骤:
- 更换打包插件。去掉springboot的maven打包插件,更改apache的打包插件
- 去掉不必要的文件。如application、test、配置文件等
- 自动装配。通过spring.factories实现自动装配,参考spring-boot-admin源码,可以不用在嵌入后,再去配置@ComponentScan扫包
- 内置静态资源文件
- 修改内置异常优先级。如果不修改的话,被嵌入的项目中,如果没有该自定义的异常,就会抛出别的异常,为了避免这个问题,将嵌入包的异常优先级提前。
源码meethigher/log-monitor-embedded
参考
- 【jar包中访问jar包,主要参考这个】codecentric/spring-boot-admin: Admin UI for administration of spring boot applications
- 如何把项目打jar包,然后暴露接口给第三方应用提供服务【实战讲解】_reggergdsg的博客-CSDN博客_jar包如何提供接口服务
- 【精髓在评论】为什么我要写spring.factories文件?_一杯Java不加糖-CSDN博客_factories
- 如何将SpringBoot项目打成可导入到其他项目的jar包,按照官方教程的话,打成的jar导入到其他项目无效。 - SegmentFault 思否
- Spring Boot 打包报错Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0_旭东怪的博客-CSDN博客
- 如何访问jar包中的静态资源(如html、css、图片等)_卡洛~carlo的博客-CSDN博客
- springboot使用多个@RestControllerAdvice时的拦截顺序 - _ME - 博客园
- Spring Boot @RestControllerAdvice 统一异常处理 - 简书
- 解决java.nio.charset.MalformedInputException: Input length = 1(mybatis绑定失败的两个原因)_licmi的博客-CSDN博客
一、更换打包插件
修改pom,将spring-boot-maven-plugin
替换成maven-compiler-plugin
。spring-boot-maven-plugin
插件本身就是将springboot项目打包成启动包,而我们不需要打包成启动包,我们需要用作嵌入的,也就是只是需要里面的字节码和静态资源而已。
1 | <build> |
打包后的效果如图
二、去掉不必要文件
可对照meethigher/log-monitor: Java实现监控本地日志并实现实时查看,查看去掉了哪些文件。
主要的就是启动类、单元测试、配置文件等。删掉之后,保证这个嵌入包干净清爽!
为了避免重复引用(其实重复引用,只要不是版本不一致,也没问题),可以在引用时,剔除掉。
1 | <dependency> |
三、自动装配
参考codecentric/spring-boot-admin: Admin UI for administration of spring boot applications
修改配置类,进行扫包
1 |
|
在src/main/resources/META-INF
路径下,创建spring.factories
1 | top.meethigher.logmonitorembedded.LogMonitorEmbeddedApplication = |
通过自动装配,可以不用在被嵌入的项目里,再去@ComponentScan扫包了。
这边我也没太用明白,但是这么搞是可以用的。也欢迎补充
四、内置静态资源文件
Tomcat8.0+,也就是servlet3.0+以上,可以直接在项目里面存放静态资源,并且被打包后嵌入还是可以访问的。
在servlet3.0协议规范中,包含在jar文件 /META-INFO/resources/ 路径下的资源是可以直接访问的。
五、修改内置异常优先级
通过@Order注解配置全局异常捕获的优先级
1 |
|