言成言成啊 | Kit Chen's Blog

实现SpringBoot的jar包嵌入其他项目

发布于2021-12-08 00:38:02,更新于2021-12-16 23:32:29,标签:java open  文章会持续修订,转载请注明来源地址:https://meethigher.top/blog

我手里有个日志监控功能,而我手里又有很多套项目,我都想加上这个日志监控功能,又不想每个项目都写一遍,怎么办呢?

于是便想到了,将项目打成jar包嵌入到其他项目里,别的项目就可以复用里面的接口、静态资源。

步骤:

  1. 更换打包插件。去掉springboot的maven打包插件,更改apache的打包插件
  2. 去掉不必要的文件。如application、test、配置文件等
  3. 自动装配。通过spring.factories实现自动装配,参考spring-boot-admin源码,可以不用在嵌入后,再去配置@ComponentScan扫包
  4. 内置静态资源文件
  5. 修改内置异常优先级。如果不修改的话,被嵌入的项目中,如果没有该自定义的异常,就会抛出别的异常,为了避免这个问题,将嵌入包的异常优先级提前。

源码meethigher/log-monitor-embedded

参考

一、更换打包插件

修改pom,将spring-boot-maven-plugin替换成maven-compiler-pluginspring-boot-maven-plugin插件本身就是将springboot项目打包成启动包,而我们不需要打包成启动包,我们需要用作嵌入的,也就是只是需要里面的字节码和静态资源而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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实现监控本地日志并实现实时查看,查看去掉了哪些文件。

主要的就是启动类、单元测试、配置文件等。删掉之后,保证这个嵌入包干净清爽!

为了避免重复引用(其实重复引用,只要不是版本不一致,也没问题),可以在引用时,剔除掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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

修改配置类,进行扫包

1
2
3
4
@Configuration
@ComponentScan("top.meethigher.logmonitorembedded")
public class LogMonitorEmbeddedApplication {
}

src/main/resources/META-INF路径下,创建spring.factories

1
org.springframework.boot.autoconfigure.EnableAutoConfiguration=top.meethigher.logmonitorembedded.LogMonitorEmbeddedApplication

通过自动装配,可以不用在被嵌入的项目里,再去@ComponentScan扫包了。

这边我也没太用明白,但是这么搞是可以用的。也欢迎补充

四、内置静态资源文件

Tomcat8.0+,也就是servlet3.0+以上,可以直接在项目里面存放静态资源,并且被打包后嵌入还是可以访问的。

在servlet3.0协议规范中,包含在jar文件 /META-INFO/resources/ 路径下的资源是可以直接访问的

五、修改内置异常优先级

通过@Order注解配置全局异常捕获的优先级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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());
}

}
发布:2021-12-08 00:38:02
修改:2021-12-16 23:32:29
链接:https://meethigher.top/blog/2021/log-monitor-embedded/
标签:java open 
付款码 打赏 分享
Shift+Ctrl+1 可控制工具栏