当前位置:   article > 正文

Spring Boot 项目瘦身指南,瘦到不可思议_spring-boot 瘦身

spring-boot 瘦身

其实到底选择哪种打包方式,主要还是看个人习惯和业务场景需求,毕竟 Spring Boot 也支持打包 war 包的。

今天的重点不是打包方式,而是解决困惑了小伙伴打包的 jar 太大的问题。

正常打包项目
给 Spring Boot 打包大家应该很熟了吧,只需要在 pom.xml 文件中配置 spring-boot-maven-plugin 打包插件:

org.springframework.boot spring-boot-maven-plugin 然后在项目根目录执行 mvn clean pavkage 就可以完成打包了,如下是我本地的一个项目打包情况:

可以看到打包出的 jar 应用是相当的大了,如小伙伴说的一样,如果每次修改一个 class 文件或者配置文件,就需要重新打包然后上传服务器的话,那确实是太麻烦了,可能上传就浪费大部分时间。。。

应用瘦身(分离lib和配置文件)
其实 jar 包大的原因在于所有的依赖包全部集成在 jar 包里面,如下是瘦身前的 jar 包内部结构:

其中 classes 就是我们项目的代码,仅仅1.3M,而 129MB 的 lib 目录是项目中所有的依赖(比如spinrg、Hibernate等依赖),如果我们能把这个 lib 目录提取出来,整个项目就会变得特别小了。说干就干。

我们知道 Spring Boot 的打包终究是依赖于 Maven ,所以想到更改打包信息,无非就是指定 Maven 的配置。

在 pom.xml 添加如下信息(后文解释):

你想要的jar包名称 org.springframework.boot spring-boot-maven-plugin true true nothing nothing repackage
<!-- 2、完成对Java代码的编译,可以指定项目源码的jdk版本,编译后的jdk版本,以及编码 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <!-- 源代码使用的JDK版本 --> 
            <source>${java.version}</source>
            <!-- 需要生成的目标class文件的编译版本 -->
            <target>${java.version}</target>
            <!-- 字符集编码 -->
            <encoding>UTF-8</encoding>
            <!-- 用来传递编译器自身不包含但是却支持的参数选项 -->  
            <compilerArguments>
                <verbose/>
                <!-- windwos环境(二选一) -->
                <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
                <!-- Linux环境(二选一) -->
                <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
            </compilerArguments>
        </configuration>
    </plugin>

    <!-- 3、将所有依赖的jar文件复制到target/lib目录 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <!--复制到哪个路径,${project.build.directory} 缺醒为 target,其他内置参数见下面解释-->
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
<!-- 4、指定启动类,指定配置文件,将依赖打成外部jar包 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <!-- 是否要把第三方jar加入到类构建路径 -->
                    <addClasspath>true</addClasspath>
                    <!-- 外部依赖jar包的最终位置 -->
                    <classpathPrefix>lib/</classpathPrefix>
                    <!-- 项目启动类 -->
                    <mainClass>com.javam4.MyApplication</mainClass>
                </manifest>
            </archive>
            <!--资源文件不打进jar包中,做到配置跟项目分离的效果-->
            <excludes>
                <!-- 业务jar中过滤application.properties/yml文件,在jar包外控制 -->
                <exclude>*.properties</exclude>
                <exclude>*.xml</exclude>
                <exclude>*.yml</exclude>
            </excludes>
        </configuration>
    </plugin>

</plugins>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
如下一一细拆如上配置:

1、spring-boot-maven-plugin
Springboot 默认使用 spring-boot-maven-plugin 来打包,这个插件会将项目所有的依赖打入项目 jar 包里面,正常打包时 spring-boot-maven-plugin 结构如下:

org.springframework.boot spring-boot-maven-plugin com.javam4.MyApplication ZIP repackage 如下是提取的修改项: true true nothing nothing 修改的作用:

includeSystemScope:jar包分两种,一种是spring、mybatis等这种项目依赖的,再就是我们外部手动引入的第三方 jar 依赖,如果该参数不设置为 true 的话是不能被打包进来的~
includes:这个节点就是排除项目中所有的 jar,那还怎么打包?
其实我们需要将打包插件替换为 maven-jar-plugin,然后使用该插件拷贝依赖到 jar 到外面的 lib 目录。

2、maven-xxx-plugin
从 2、3、4 你会发现用到了 maven-xxx-plugin 格式的三种插件,简单说一下这三者的作用:

maven-compiler-plugin:

完成对Java代码的编译,可以指定项目源码的jdk版本、编译后的jdk版本,以及编码,如果不写这个插件也是没问题的,不写会使用默认的 jdk 版本来处理,只是这样容易出现版本不匹配的问题,比如本地maven环境用的3.3.9版本,默认会使用jdk1.5进行编译,而项目中用的jdk1.8的编译环境,那就会导致打包时编译不通过。

maven-dependency-plugin:

作用就是将所有依赖的jar文件复制到指定目录下,其中涉及到的 ${project.xx} 见下文补充。

maven-jar-plugin:

主要作用就是将maven工程打包成jar包。

主要说一下 maven-jar-plugin 插件的如下配置:

*.properties *.xml *.yml 打包时排除资源配置文件,如果排除了配置文件那么项目启动是怎么读取呢?

配置文件有这么一个默认的优先级:

当前项目config目录下 > 当前项目根目录下 > 类路径config目录下 > 类路径根目录下

因此只需要将配置文件复制一份到与 jar 包平级目录下,或者与jar包平行config目录下,就能优先使用此配置文件,达到了伪分离目的。
龙华大道1号 http://www.kinghill.cn/Dynamics/2106.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/376252
推荐阅读
相关标签
  

闽ICP备14008679号