转载 2017年09月18日 09:21:53
  • 577

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

Maven xml代码  
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. </plugins>
  8. </build>

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

解决步骤:

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

Xml代码  
  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. <version>1.5.1.RELEASE</version>
  5. <configuration>
  6. <layout>ZIP</layout>
  7. <excludes>
  8. <exclude>
  9. <groupId>ch.qos.logback</groupId>
  10. <artifactId>logback-classic</artifactId>
  11. </exclude>
  12. <exclude>
  13. <groupId>com.google.guava</groupId>
  14. <artifactId>guava</artifactId>
  15. </exclude>
  16. </excludes>
  17. </configuration>
  18. </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项目就可以继承一套全公司统一的配置.

2. 将上一步exclude掉的jar放到一个外置的目录中. 如:

然后执行如下命令启动应用:

Cmd代码  
  1. java -Dloader.path="lib/" -jar common-service.jar

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镜像会很大.

http://rickgong.iteye.com/blog/2368985

解决SpringBoot jar包太大的问题的更多相关文章

  1. 解决SpringBoot jar包中的文件读取问题

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们 ...

  2. 解决springboot jar包冲突

    直接导入springboot父项依赖,其它相关springboot依赖version不用写,由spring自动依赖. <parent> <groupId>org.springf ...

  3. 如何解决Maven和SBT下载Jar包太慢

    国内:如何解决Maven和SBT下载Jar包太慢 Maven 远程仓库 <mirror> <id>ui</id> <mirrorOf>central&l ...

  4. SpringBoot Jar包瘦身 - 跟大文件说再见!

    前言 SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼.就是 编译出来的 Jar 包很大,如果工程引入了许多开 ...

  5. DIOCP数据包太大,请在业务层分拆发送

    DIOCP数据包太大,请在业务层分拆发送 DIOCP日志记录异常:数据包太大,请在业务层分拆发送...... 跟踪发现,原因在下图:

  6. spring maven项目解决依赖jar包版本冲突方案

    引入:http://blog.csdn.net/sanzhongguren/article/details/71191290 在spring reference中提到一个解决spring jar包之间 ...

  7. XJar: Spring-Boot JAR 包加/解密工具,避免源码泄露以及反编译

    XJar: Spring-Boot JAR 包加/解密工具,避免源码泄露以及反编译 <?xml version="1.0" encoding="UTF-8" ...

  8. 用好这几个技巧,解决Maven Jar包冲突易如反掌

    前言 大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊 ...

  9. SpringBoot jar包中资源加载问题

    在IDE下调试怎么也没有发现问题,但是部署到服务器上,提示找不到资源,找了半天资料总算是找到了原因: Jar包中的资源加载不能使用File方式,只能使用InputStream方式读取.知道原因就好解决 ...

随机推荐

  1. week0713.5 newspaper 安装问题

    然后爆红说nltk==2.0.5 太老了 所以我们 把包下载下来将requirements文件中nltk==2.0.5改成3.3.0 然后 将包打包 然后安装这个包就OK 下载newpaper wge ...

  2. 微信开发 invalid openid

    微信开发时候测试号运行正常,换到正式号就会报invalid openid的错误. 看了微信问答系统里的答案,说是json格式的问题,但是我这边不是这个原因. 后来突然想到了,应该是AppId和AppS ...

  3. 打开控制台F12弹出弹窗

    window.onload=function(){                 document.onkeydown=function(){                     var e=w ...

  4. 《CSAPP》符号和符号表

    符号和符号表 每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息. 有三种不同的符号: 由m定义并能被其他模块引用的全局符号.对应非静态的C函数以及不带C static属性的全局变 ...

  5. Block学习总结

    最近网上浏览了一些关于Block的文章,自己进行一下消化吸收. Void (^blockName)(parma)-> Block声明 Void (^) (parma){};  ->Bloc ...

  6. 347. Top K Frequent Elements 最常用的k个元素

    [抄题]: Given a non-empty array of integers, return the k most frequent elements. For example,Given [1 ...

  7. eclipse装了springboot插件后yml文件没有自动提示问题

    选择打开方式:spring yaml

  8. github windows配置以及ssh生成 Permission denied (publickey)

    1:进入cmd命令下,或者可以使用GIt工具   (如果出现了 Permission denied 或者配置多个SSH Key跳第6步) git工具  下载地址:https://git-scm.com ...

  9. Python之ftp服务器

    今天把做的ftp服务器过程总结一下,先看看要求 一.需求 1. 用户加密认证 2. 允许同时多用户登录 3. 每个用户有自己的家目录 ,且只能访问自己的家目录 4. 对用户进行磁盘配额,每个用户的可用 ...

  10. GUI学习之〇——PyQt5安装

    GUI(Graphical User Interface)是程序和软件使用者的接口,好的GUI是一个良好的软件的前提,在这里演示一下用PyQt5做一个GUI的方法 软件需求:python3.6 用的是 ...