SpringBoot分离打包:将jar包与lib依赖、配置文件分开

文章目录

  • 一、前言
  • 二、正文
    • 1.整个项目的目录结构
    • 2.系统环境变量配置
    • 3.pom文件配置——本文重点,其它部分甚至不用看
    • 4. 打包
    • 5.测试,测试依赖于前两篇所构建的测试项目,当然这不重要
  • 三、总结

一、前言

昨天和项目组内一位经验丰富的老师傅探讨,围绕着SpringBoot打包后动不动就一百多兆,在现场远程维护部署时非常不方便的问题,进行了一番请教。问题的根本是:有时候仅仅改动了一点点东西,却要发给现场替换包含所有依赖的jar包,这非常的笨重不方便。

于是又学到了新知识。抽空浏览了网上的资料,结合工作中的实际使用场景,整理了本文的内容,方便后期随时取用。

二、正文

之前一直使用SpringBoot初始化建立项目默认的spring-boot-maven-plugin插件,进行项目打包,这个插件会将项目所有的依赖打入BOOT-INF/lib下,这就导致了jar包的体积非常臃肿,尤其涉及到几十个子项目时,整个项目的体积可想而知。但是,各项目之间有非常的公共依赖,因此,分离打包还是比较有意义的。

本文还是在上两篇的项目上进行测试,毕竟只改了pom文件中的build标签下的插件内容
如果有兴趣可翻阅:SpringBoot整合新版Mybatis-Plus代码生成器、SpringBoot整合Knife4j替代Swagger。

1.整个项目的目录结构

SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第1张图片

2.系统环境变量配置

SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第2张图片

3.pom文件配置——本文重点,其它部分甚至不用看

pom中几乎所有的配置项都有比较详细的注释,表明每个属性是做什么,以及如何配置,请根据项目实际进行配置。

  • properties标签中定义依赖的输出目录、jar包的输出目录、resources中配置文件的输出目录。
   <properties>
        
        <output.dependence.file.path>lib/output.dependence.file.path>
        
        <output.jar.file.path>bin/output.jar.file.path>
        
        <output.resource.file.path>config/output.resource.file.path>
    properties>
  • build标签:plugins标签中一共包含三个插件:maven-jar-plugin、maven-dependency-plugin和maven-resources-plugin。

啰嗦一句,在下方配置中会看到有…/这种相对路径的配置,其实非常简单,只要把握住一点,一切从最终的jar包出发,考虑如何让它能够找到它所依赖的lib和配置文件即可。

<build>
        <plugins>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-jar-pluginartifactId>
                <configuration>
                    
                    <outputDirectory>${env.LEARN_HOME}/${output.jar.file.path}outputDirectory>
                    
                    <excludes>
                        <exclude>*.propertiesexclude>
                        <exclude>*.ymlexclude>
                        <exclude>*.xmlexclude>
                        <exclude>*.txtexclude>
                    excludes>
                    <archive>
                        
                        <addMavenDescriptor>trueaddMavenDescriptor>
                        
                        <manifest>
                            
                            <useUniqueVersions>falseuseUniqueVersions>
                            
                            <addClasspath>trueaddClasspath>
                            
                            
                            
                            <classpathPrefix>../${output.dependence.file.path}classpathPrefix>
                            
                            <mainClass>com.ieslab.knife4j.demo.DemoApplicationmainClass>
                        manifest>
                        <manifestEntries>
                            
                            
                            
                            <Class-Path>../${output.resource.file.path}Class-Path>
                        manifestEntries>
                    archive>
                configuration>
            plugin>

            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-dependency-pluginartifactId>
                <executions>
                    <execution>
                        <id>copy-dependenciesid>
                        <phase>packagephase>
                        <goals>
                            <goal>copy-dependenciesgoal>
                        goals>
                        <configuration>
                            
                            <outputDirectory>${env.LEARN_HOME}/${output.dependence.file.path}outputDirectory>
                            
                            <excludeTransitive>falseexcludeTransitive>
                            
                            <stripVersion>falsestripVersion>
                        configuration>
                    execution>
                executions>
            plugin>
            
            <plugin>
            	<groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-resources-pluginartifactId>
                <executions>
                    
                    <execution>
                        <id>copy-resourcesid>
                        <phase>packagephase>
                        <goals>
                            <goal>copy-resourcesgoal>
                        goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resourcesdirectory>
                                    <includes>
                                    	
                                        <exclude>*.propertiesexclude>
                                        <exclude>*.ymlexclude>
                                        <exclude>*.xmlexclude>
                                        <exclude>*.txtexclude>
                                    includes>
                                resource>
                            resources>
                            
                            <outputDirectory>${env.LEARN_HOME}/${output.resource.file.path}outputDirectory>
                        configuration>
                    execution>
                executions>
            plugin>
        plugins>
    build>

4. 打包

首先,把右上角的闪电图标点上,可以在打包时“跳过测试模式”。然后分别双击执行clean和package命令,进行清理和打包。
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第3张图片
打包成功:
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第4张图片
打包完成后,我们去输出目录看一下:

SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第5张图片
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第6张图片
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第7张图片

5.测试,测试依赖于前两篇所构建的测试项目,当然这不重要

进入bin目录下:在地址栏输入cmd回车
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第8张图片
启动项目:java -jar demo-1.0.0.jar
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第9张图片
启动成功:
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第10张图片
浏览器输入knife4j地址验证一下:
SpringBoot分离打包:将jar包与lib依赖、配置文件分开_第11张图片

三、总结

本文关于SpringBoot分离打包的内容就这么多,有兴趣可以试一下。

当然还有很多不足需要继续探索的地方,比如,将所有的配置文件都输出到config目录下,项目很多怎么办?是不是应该考虑config目录下,每一个子项目一个独立目录?还有整个项目的公共配置如何处理?不可能每个项目都维护一份公共配置信息,万一修改需要修改很多处,那需要怎么解决?

下次见。

你可能感兴趣的:(开发百宝箱系列,spring,boot,jar,java)