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

Posted 言成言成啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现SpringBoot的jar包引入其他项目相关的知识,希望对你有一定的参考价值。

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

于是便想到了,将项目打成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项目打包成启动包,而我们不需要打包成启动包,我们需要用作嵌入的,也就是只是需要里面的字节码和静态资源而已。

<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

修改配置类,进行扫包

@ComponentScan("top.meethigher.logmonitorembedded")
public class LogMonitorEmbeddedApplication 
    public static void main(String[] args) 
        SpringApplication.run(LogMonitorEmbeddedApplication.class, args);
    

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包引入其他项目的主要内容,如果未能解决你的问题,请参考以下文章

Springboot项目打包引入lib目录下jar包

Springboot引入外部第三方jar包

SpringBoot项目引入本地Jar包

springboot项目如何打包给其他项目引用

Spring boot如何引入本地jar包?

Springboot中如何引入本地jar包,并通过maven把项目成功打包成jar包部署