SpringBoot之jar瘦身打包部署

SpringBoot服务采用jar瘦身的方式进行部署:

背景

SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,
但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多则一百来兆,
如果服务器部署在公司内网,速度还行,我们需要上传至公网服务器时,是非常慢的,编译出来的 Jar 包很大,
如果工程引入了许多开源组件(Spring Cloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦。
这就引出了SpringBoot项目Jar包如何瘦身部署。

一、jar包瘦身

1、回顾以往的常用打包方式

首先,我们项目的 pom.xml 文件中的打包方式如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

说明:这是 SpringBoot 中默认的打包方式,也是我们平时常用的打包方式。

2、JAR包瘦身的打包方式:

我们对 SpringBoot 中默认的打包方式做一些配置:

<build>
    <!--使用JAR包瘦身的方式-->
      <plugins>
          <!--1、插件maven-dependency-plugin负责创建lib目录,同时把需要依赖的jar包全部复制进去。-->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <executions>
                  <execution>
                      <id>copy-dependencies</id>
                      <phase>package</phase>
                      <goals>
                          <goal>copy-dependencies</goal>
                      </goals>
                      <configuration>
                           <!--将lib中的所有jar包输出的位置-->
                          <outputDirectory>${project.build.directory}/lib</outputDirectory>
                          <!-- 间接依赖也拷贝 -->
                          <excludeTransitive>false</excludeTransitive>
                          <!-- 带上版本号 -->
                          <stripVersion>true</stripVersion>
                      </configuration>
                  </execution>
              </executions>
          </plugin> 
          <!--2、插件spring-boot-maven-plugin,打项目jar(即剔除lib文件下的所有依赖jar包)-->
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <configuration>
                  <!--项目的启动类-->
                  <mainClass>com.lucky.TestServiceApplication</mainClass>
                  <!--指定了打包方式为 ZIP,注意:一定是大写的-->
                  <layout>ZIP</layout>
                  <includes>
                      <!--有自己的依赖 jar,可以在此导入-->
                      <include>
                          <groupId>nothing</groupId>
                          <artifactId>nothing</artifactId>
                      </include>
                  </includes>
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <!--repackage:剔除其它的依赖,只需要保留最简单的结构-->
                          <goal>repackage</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
          <!--3、编译插件,通过 JDK 1.8 进行编译(根据实际情况配置)-->
          <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
              </configuration>
          </plugin>
      </plugins>
          
</build>

参数说明:
mainClass,我们指定了项目的启动类
layout,我们指定了打包方式为 ZIP,注意:一定是大写的
includes,有自己的依赖 jar,可以在此导入
repackage,剔除其它的依赖,只需要保留最简单的结构

3、拷贝target下的lib及打包好的项目**.jar

通过 maven clean package打包完成后,我们在target文件下,拷贝lib文件及项目jar包,可以看到此时的项目jar 包只有几十KB或者几兆了。

二、项目部署及启动

我们将 lib 目录以及最后打包的瘦身项目 jar 包,上传至服务器,
然后使用命令启动服务:

nohup java -Dloader.path=./lib -jar ./test-service-0.0.1-SNAPSHOT.jar &

参数说明:
-Dloader.path,告诉它所依赖的 maven jar 包位置
test-service-0.0.1-SNAPSHOT.jar,项目 jar 包的名字
nohup、&,使得 jar 包在服务后台运行

三、总结

1、通常情况下,一个工程项目架构确定后,引入的jar包基本上不会变,改变的大部分是业务逻辑;
2、后续如果需要变更业务逻辑,只需要轻量地编译工程,大大提高项目部署的效率;
3、简单来讲,jar瘦身就是将jar包和classes文件分离出来,使用瘦身部署,方便每次的迭代更新,不用每次都上传一个很大的 jar 包,从而节省部署时间。

注意:

需要注意的一点,如果后续有发生jar包的变动,需要重新打包更新lib。

maven引入本地jar包时,不能打入jar部署包的问题解决方案:
第一步:

  <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <!-- 添加以下配置会将本地jar引入最终打的jar包中 -->
               <configuration>
                   <includeSystemScope>true</includeSystemScope>
               </configuration>
           </plugin>
       </plugins>
   </build>

第二步:将nothing改为本地包对应的groupId和artifactId,默认是nothing(没有什么)

<include>
    <groupId>***</groupId>
    <artifactId>***</artifactId>
</include>

你可能感兴趣的:(JAVA基础,spring,boot,maven,java,大数据)