实现SpringBoot的jar包引入其他项目
Posted 言成言成啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现SpringBoot的jar包引入其他项目相关的知识,希望对你有一定的参考价值。
我手里有个日志监控功能,而我手里又有很多套项目,我都想加上这个日志监控功能,又不想每个项目都写一遍,怎么办呢?
于是便想到了,将项目打成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项目打包成启动包,而我们不需要打包成启动包,我们需要用作嵌入的,也就是只是需要里面的字节码和静态资源而已。
<build>
<plugins>
<!--该插件3.2.0版本配合多个springboot版本都有bug,建议采用3.1.0-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
打包后的效果如图
二、去掉不必要文件
可对照meethigher/log-monitor: Java实现监控本地日志并实现实时查看,查看去掉了哪些文件。
主要的就是启动类、单元测试、配置文件等。删掉之后,保证这个嵌入包干净清爽!
为了避免重复引用(其实重复引用,只要不是版本不一致,也没问题),可以在引用时,剔除掉。
<dependency>
<groupId>top.meethigher</groupId>
<artifactId>log-monitor-embedded</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</exclusion>
<exclusion>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</exclusion>
</exclusions>
</dependency>
三、自动装配
参考codecentric/spring-boot-admin: Admin UI for administration of spring boot applications
修改配置类,进行扫包
@Configuration
@ComponentScan("top.meethigher.logmonitorembedded")
public class LogMonitorEmbeddedApplication
在src/main/resources/META-INF
路径下,创建spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=top.meethigher.logmonitorembedded.LogMonitorEmbeddedApplication
通过自动装配,可以不用在被嵌入的项目里,再去@ComponentScan扫包了。
这边我也没太用明白,但是这么搞是可以用的。也欢迎补充
四、内置静态资源文件
Tomcat8.0+,也就是servlet3.0+以上,可以直接在项目里面存放静态资源,并且被打包后嵌入还是可以访问的。
在servlet3.0协议规范中,包含在jar文件 /META-INFO/resources/ 路径下的资源是可以直接访问的。
五、修改内置异常优先级
通过@Order注解配置全局异常捕获的优先级
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class LogMonitorExceptionHandler
private final static Logger log = LoggerFactory.getLogger(LogMonitorExceptionHandler.class);
@ExceptionHandler(CommonException.class)
public BaseResponse handleCommonException(CommonException e)
e.printStackTrace();
log.error("CommonException : ", e.getResponseEnum().desc);
return ResponseUtils.getResponseCode(e.getResponseEnum());
以上是关于实现SpringBoot的jar包引入其他项目的主要内容,如果未能解决你的问题,请参考以下文章