当前位置:
首页
文章
前端
详情

springboot2.2.X手册:项目从100M瘦身到100K,部署省事多了!

目录

​资源分离的核心

资源文件分离的构建配置

打包运行

上一篇:springboot2.2.X手册:Easypoi导出excel,最新版的手感香不香?

现在很多应用都是springboot,spring提供了一种富JAR的打包方式,直接打包后就可以运行,非常方便。

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

同时有很多公司,也会经常打包成docker file,直接部署到阿里云上,简单明了,毕竟人家提供了一体化的部署运维方案。

但是如果只是单独采用富JAR包进行部署,会有一定的操作麻烦性

1、富JAR包每次打包后,很大很大,差不多几百兆,每次上传到服务器都是非常辛苦

2、每次发布都是全量发布,假如只是修改一个配置文件,那此时也是要全量发布,当系统很大的时候,风险就会更大,毕竟改少不如该多

3、项目交接出现断档,在项目中,经常是有人离职有人来新入职,如果原来的代码是很老的,作为一个新人进来,是否有足够的胆量进行把这个项目全部替换,别说有什么交接文档之类,很多公司在进行技术管理的时候,都非常混乱,不单单是小公司,某世界500强的公司也见识过,非常痛苦。

4、没有上发布系统的公司,现在发布系统比较普遍了,jekines非常好用,可惜小编还是喜欢阿里的自动化发布,而且,jekines不支持灰度。

5、推荐一款发布系统walle,瓦力部署,界面优雅,操作简单,支持灰度。

springboot2.2.X手册:项目从100M瘦身到100K,部署省事多了!

​资源分离的核心

当我们不采用docker,自己进行手动部署的时候,最好是lib与资源分离,因为每次lib里面加载的包体,非常多,数量会非常庞大,这样子动不动就几百M。

我们分离的目的,就是把lib分离处理,资源文件分离处理,不用每次发布的时候,都重新把lib里面的包体再打包一遍,毕竟,正常情况下,里面的包体是不变的,我们需要改变的经常只有资源文件或者业务包,而资源文件加上业务包,也往往只有几百K的大小,没必要为了这个一行代码,把整个项目全部重新打包了。

其实这里也是可以打包成war包的,这样子就可以部署到tomcat上面去,但是呢,小编不是很想,毕竟这样子做的话,我还需要去部署tomcat在服务器上,好麻烦的说,所以这里引入了执行脚本来做,本质上跟执行springboot自带的jar包的打包方式是一样的。

springboot2.2.X手册:项目从100M瘦身到100K,部署省事多了!

资源文件分离的构建配置

今天我们来介绍另外一种打包方式,就是资源文件分离的方式,可以直接复制使用

需要改名的地方,我已经标注:需要改名

<build>
        <plugins>
            <!-- 打JAR包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!-- 不打包资源文件(配置文件和依赖包分开) </excludes> -->
                    <excludes>
                        <exclude>logback-spring.xml</exclude>
                        <exclude>*.yml</exclude>
                    </excludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- jar包不包含唯一版本标识 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!--指定入口类  需要改名 -->
                            <mainClass>com.boots.run.BootsApiApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
                            <Class-Path>./resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
            <!-- 该插件的作用是用于复制依赖的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>
                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 该插件的作用是用于复制指定的文件 -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 复制配置文件 -->
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <includes>
                                        <include>*.properties</include>
                                        <include>*.xml</include>
                                        <include>*.yml</include>
                                    </includes>
                                    <excludes>
                                        <exclude>*.jar</exclude>
                                    </excludes>
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}/resources</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- SpringBoot 打包插件,把 maven-jar-plugin 打成的jar包重新打成可运行jar包 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 -->
                    <includes>
                        <include>
                            <groupId>null</groupId>
                            <artifactId>null</artifactId>
                        </include>
                    </includes>
                    <layout>ZIP</layout>
                    <!--使用外部配置文件,jar包里没有资源文件 -->
                    <addResources>true</addResources>
                    <outputDirectory>${project.build.directory}/resources</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
                            <!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
                            <!--<classifier>run</classifier> -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 对打包后的文件重新进行组装 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <!-- 定义app名称+版本号 -->
                                <property name="appName">${project.artifactId}-${project.version}</property>
                                <!-- 定义运行文件总路径 -->
                                <property name="run">target/run</property>
                                <!-- 定义静态资源文件路径 -->
                                <property name="res">target/run/resources</property>
                                <!-- 复制启动文件:需要改名 -->
                                <copy file="${project.basedir}/target/${appName}.jar" tofile="${run}/boots-api.jar" />
                                <!-- 复制包文件 -->
                                <copy todir="${run}/lib">
                                    <fileset dir="target/lib" />
                                </copy>
                                <!-- 复制资源文件 -->
                                <copy todir="${res}">
                                    <fileset dir="target/resources">
                                        <include name="**/*.properties" />
                                        <include name="**/*.xml" />
                                        <include name="**/*.yml" />
                                    </fileset>
                                </copy>
                                <!-- 复制启动脚本 -->
                                <copy file="${project.basedir}/runfile/startup-dev.sh" tofile="${run}/startup-dev.sh" />
                                <copy file="${project.basedir}/runfile/startup-test.sh" tofile="${run}/startup-test.sh" />
                                <copy file="${project.basedir}/runfile/startup-pro.sh" tofile="${run}/startup-pro.sh" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <!-- 资源复制 -->
        <resources>
            <!-- 把src里面的xml文件加入到jar包里面 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <!-- 把resources里面的freemaker文件夹移除 -->
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>freemaker/**</exclude>
                </excludes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

打包运行

打包运行后,会在target生产一个run包,里面都是可以执行的sh文件

备注:sh文件里面的项目名称,需要自己去改名

资源文件分离的话,当改一个资源文件的时候,不用这个包重新打包,虽然我还是喜欢docker file,也提供一下这种方案。

springboot2.2.X手册:项目从100M瘦身到100K,部署省事多了!

--END--

作者:@溪云阁

原创作品,抄袭必究,转载注明出处

如需要源码,转发,关注后私信我

部分图片或代码来源网络,如侵权请联系删除,谢谢!

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。