spring boot 瘦身

Spring Boot 越来越流行,使用Spring Boot 技术的公司和项目也越来越多, 相比之前框架中大量的配置文件,繁琐的配置确实方便了很多,提高了开发的效率.

不同于传统的War包发布,Spring Boot 把整个项目打包成一个可运行的Jar包,导致了这个Jar包很大(通常有40M+)。如今迭代发布时常有的事情,每次都上传一个如此庞大的文件,会浪费很多时间。

而今微服务框架也越来越成熟,越来越流行,但是每个服务中有大量重复的jar包,不得不说这是一种资源的浪费.

废话不多说直接开始改造现在的项目

一个简单的web服务jar包,可以看一下初始大小就有32MB,几乎全都是引入的包

瘦身只需改一下pom.xml即可

spring boot是用spring-boot-maven-plugin进行打包,spring官方文档中发现可以通过配置使得该插件在打包时忽略特定的依赖。

先将第三方的jar包导出

在项目pom文件中添加maven依赖插件(官方文档)将第三方的jar包导出

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

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>E:/lib</outputDirectory>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

mvn clean install -Dmaven.test.skip=true -DoutputDirectory=E:/lib(-DoutputDirectory=E:/lib是命令动态指定项目依赖的jar包导出的路径,若在项目中指定了outputDirectory的标签值,则将覆盖此动态路径)这里是将所有第三方的jar包都导出了

或者你也可以直接用

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

打包,然后解压,将lib复制出来

然后就开始瘦身了

第一种: 用groupId和artifactId将不需要打包的jar排除

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
                <excludes>
                    <exclude>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>

        <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>E:/lib</outputDirectory>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>-->

    </plugins>
</build>

第二种: 使用excludeGroupIds排除

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
                <excludeGroupIds>
                    org.springframework.boot,
                    org.springframework,
                    org.springframework.data,
                    org.mongodb,
                    com.github.0604hx,
                    com.fasterxml.jackson.core,
                    commons-beanutils,
                    commons-codec,
                    org.apache.commons,
                    org.apache.tomcat.embed,
                    org.hibernate,
                    org.slf4j,
                    com.jayway,
                    org.jboss,
                    com.alibaba,
                    com.fasterxml,
                    commons-collections,
                    ch.qos.logback,
                    org.scala-lang,
                    org.yaml,
                    org.jboss.logging,
                    javax.validation,
                    nz.net.ultraq.thymeleaf,
                    org.thymeleaf,
                    ognl,
                    org.unbescape,
                    org.javassist
                </excludeGroupIds>
            </configuration>
        </plugin>

        <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>E:/lib</outputDirectory>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>-->

    </plugins>
</build>

第三种: includes  include只保留自己(最精简)

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
                <includes>
                    <include>
                        <groupId>com.example</groupId> <!--自己的groupId-->
                        <artifactId>demo</artifactId> <!--自己的artifactId-->
                    </include>
                </includes>
            </configuration>
        </plugin>

        <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>E:/lib</outputDirectory>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>-->

    </plugins>
</build>

现在用第三种瘦身方式打个包看一下包的大小

只有92kb,这样每次上传就快多了,几乎可以秒传了

再看一下启动

启动命令和之前有点区别

java -Dloader.path=lib -jar demo-0.0.1-SNAPSHOT.jar

lib文件夹和jar包同级

注意:(浪费我一天)

如果是win10,使用powershell执行启动命令时会出现

这个错不是因为jar包的问题,也不是lib位置有问题, 是因为powershell有问题

使用cmd

正常启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值