spring boot添加spring-boot-maven-plugin插件后, 打出来的Jar动辄几十上百兆. 这种FatJar包在传输时会相当不便, 尤其是某些外企, 服务器可能在美国, 上传速度可能不到200K, 严重影响工作效率.

本文就说说怎样减少FatJar的大小.

SpringBoot的web应用一般都添加了spring-boot-maven-plugin插件.

Maven xml代码

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

打出来的jar包内置了所有的依赖jar, 放在BOOT-INF/lib目录, 所以体积很大.

解决步骤:

  1. 修改spring-boot-maven-plugin的参数, 使其将内置的jar包exclude掉, 例如:

Xml代码

<plugin>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-maven-plugin</artifactId>  
   <version>1.5.1.RELEASE</version>  
   <configuration>  
      <layout>ZIP</layout>  
       <excludes>  
           <exclude>  
               <groupId>ch.qos.logback</groupId>  
               <artifactId>logback-classic</artifactId>  
           </exclude>  
           <exclude>  
               <groupId>com.google.guava</groupId>  
               <artifactId>guava</artifactId>  
           </exclude>  
       </excludes>  
   </configuration>  
</plugin>  

这样, 打出来的jar中就不会包含被exclude掉的依赖了.注意layout应设置为ZIP,不然后面会出现找不到类的错误.

exclude不止一种写法, 其他的exclude方式参见http://docs.spring.io/spring-boot/docs/current/maven-plugin/start-mojo.html.

可以通过mvn dependency:tree命令查看当前项目的依赖.

因为依赖的jar已经被排除掉了, FatJar变瘦, 直接运行就会报ClassNotFoundException. 所以还要进行下一步.

可以在公司的parent pom.xml的pluginManagement部分添加spring-boot-maven-plugin的配置, 这样每个web项目就可以继承一套全公司统一的配置.

  1. 将上一步exclude掉的jar放到一个外置的目录中. 如:
    在这里插入图片描述
    然后执行如下命令启动应用:

    Cmd代码

java -Dloader.path="lib/" -jar common-service.jar  
或
后台启动
nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 &


命令详解:

nohup:不挂断地运行命令,退出帐户之后继续运行相应的进程。

>日志文件名.log:是nohup把command的输出重定向到当前目录的指定的“日志文件名.log”文件中,即输出内容不打印到屏幕上,而是输出到”日志文件名.log”文件中。不指定文件名会在当前目录创建nohup.out,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。


2>&1:2就是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出么。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的“日志文件名.log”文件中。


java -jar 自己的springboot项目.jar:执行springboot的项目,如果单单只执行该命令,linux只会短暂的运行该项目,当退出控制台后会自动关闭该项目。


最后的&:让改作业在后台运行。

loader.path指向了外置目录,告诉springboot允许从外部加载依赖.

loader.path的更多用法参见:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching.

可以用mvn dependency:copy-dependencies命令将jar包copy到这个外置目录.

经测试, 经过上面的两个步骤, 笔者的应用从70MB缩小为1.3MB, 极大地缩小了体积.

既缩小了体积, 便于传输, 又很容易地控制依赖jar的版本, 做到全公司统一, 共享同一套依赖集合.

特别地, 如果要讲应用部署到docker中, 需要修改dockerfile, 将依赖目录挂载到docker镜像中, 修改应用的启动命令(可能会是dockerfile的entrypoint),添加loader.path参数, 指向挂载进来的依赖目录. 不建议将依赖ADD到docker镜像, 那样的话docker镜像会很大.​​​​

转载于:https://blog.csdn.net/m0_37598340/article/details/86149186

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐