• SpringBoot打包瘦身


    起因:使用SpringBoot开发项目,引用了很多依赖,最终打包成可运行的jar文件时,往往有几十M,或者更大,上传服务器要浪费很长时间。

    优化方式一

    1. 依赖分离

      SpringBoot可运行的jar文件很大是因为,jar文件里包含了很多依赖jar,所以才会生成几十M的文件。

      解决办法是在maven配置中,使用插件:

    <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <!--使用该插件打包 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                <useUniqueVersions>false</useUniqueVersions>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>/data/server/system-demo/libs/</classpathPrefix>
                                <mainClass>com.zh.system.SystemApplication</mainClass>
                            </manifest>
                            <manifestEntries>
                            </manifestEntries>
                        </archive>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>/data/server/system-demo/libs/</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <!-- 跳过单元测试 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <skipTests>true</skipTests>
                    </configuration>
                </plugin>
            </plugins>
        </build>

      maven-jar-plugin插件的作用是jar运行时使用的配置,属性包括:classpathPrefix指定外部jar的路径,mainClass指定jar包的启动类

      maven-dependency-plugin插件的作用是打包时,指定依赖jar拷贝的目录。

      /data/server/system-demo 是我准备的项目运行jar包的目录。

      我这里使用的路径都是/data/server/system-demo/libs/,如果你是在windows系统下编译打包项目,你可以到项目所在的workspace的磁盘根目录下查找,会发现也生成了这样的目录,项目相关的jar包都拷贝到这里了。在服务器上创建目录/data/server/system-demo/libs/,并且把项目需要的jar包都上传到此目录。

    2. 配置文件管理

      我的项目中的配置文件按服务器环境配置了几套,如下图:

      在application.yml的代码,使用这条命令指定加载的子配置文件:spring.profiles.active: test

      这样管理配置很方便,避免多个服务器环境之间的参数切换,带来混淆的问题。但如果你修改代码之后,每个环境都要发布一遍,就会需要修改spring.profiles.active的值后,重复打包的问题。

      所以,按照SpringBoot的运行加载规则,如果在运行jar统计目录有config文件夹,会被提前加载的。我们只需要在/data/server/system-demo/下创建一个config文件夹。并只上传此环境的配置文件就好了。

      方法1:正常打包,这些配置文件会在jar包的config目录下,我们只要删掉这些文件,在jar包运行时,就会自动读取/data/server/system-demo/config 里面的文件了,避免了很多重复打包工作。

      方法2:在打包时,是可以使用maven插件把配置文件排除的,我还没试。

    3. 总结

      当项目运行时,最终在system-demo目录下,会有2个文件夹,2个文件。

      system-demo-1.0-SNAPSHOT.jar      -------SpringBoot启动jar包

      config    ---------项目的配置文件

      libs      -----------项目的依赖jar

      nohup.out   ------nohup命令运行jar文件之后,生成的临时日志文件

    优化方式二

    1. 正常编译JAR包,解压出lib文件夹

      POM文件如下:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.johnnian.App</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                <execution>
                     <goals>
                         <goal>repackage</goal>
                     </goals>
                 </execution>
               </executions>
            </plugin>
         <plugins>
    <build>

      进入项目根目录,执行命令:mvn clean install

      将编译后的Jar包解压,拷贝 BOOT-INF 目录下的lib文件夹 到目标路径;

    2. 修改pom.xml配置,编译出不带 lib 文件夹的Jar包

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.johnnian.App</mainClass>
                    <layout>ZIP</layout>
                    <includes> 
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>  
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
         <plugins>
    <build>

      配置完成后,再次执行编译:mvn clean install

      生成的 Jar 包体积明显变小,外部的 jar 包已经不会被引入了。

    3. 运行编译后的Jar包

      将 步骤1 解压出来的lib文件夹、步骤2编译的jar包放在同一个目录, 运行下面命令:

    java -Dloader.path=/path/to/lib -jar /path/to/springboot-jsp-0.0.1-SNAPSHOT.jar 

      或者在maven中输入一下命令导出需要用到的jar包

    mvn dependency:copy-dependencies -DoutputDirectory=F:ideaWorkPlaceAnalysisEnginelib  -DincludeScope=runtime

      备注:将/path/to/改成实际的路径。-Dloader.path=lib文件夹路径

      最终目录文件结构是:

    ├── lib   #lib文件夹
    └── springboot-jsp-0.0.1-SNAPSHOT.jar 

      说明:

      1、通常,一个工程项目架构确定后,引入的jar包基本上不会变,改变的大部分是业务逻辑;

      2、后面如果需要变更业务逻辑,只需要轻量地编译工程,大大提高项目部署的效率。

    
    

    步骤1: 正常编译JAR包,解压出lib文件夹

  • 相关阅读:
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-17 MyBatis 数据库逆向生成工具
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-16 数据源连接数详解
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-14 数据层HikariCP与MyBatis整合
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-13 HikariCP数据源简述
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-12 SpringBoot自动装配简述
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-10 聚合工程整合SpringBoot
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-9 数据库物理外键移除原因讲解
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-8 生产环境增量与全量脚本迭代讲解
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-7 PDMan数据库建模工具使用
    阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-6 构建聚合工程-2
  • 原文地址:https://www.cnblogs.com/huanshilang/p/14010614.html
Copyright © 2020-2023  润新知