////
根源
随着 Boot的流行,越来越多开发者选择利用 Boot来发布Web软件。不同于旧有的War包发布, Boot把整个项目打包成一个可运行的Jar包(即所谓的Flat Jar),引发了这个Jar包很大(通常有40M+)。如今迭代发布时常有的bbm蓝莓交易平台事情,每次都提交一个如此庞大的资料 ,会浪费很多时间。
下面就以一个小项目为例,简述小弟所用的瘦身计划 。当然如果是内网发布或者你用的宽带异常给力,瘦身就没有多大意义了。
实践 项目简介
新建一个练习用的蓝莓市场外汇官网项目 ,其架构如下
其中ht-ui-web依赖于ht-、ht-、ht- ,实现了一个简单的。
接着打包项目 ,整个jar包24M这样
瘦身准备
首先我们要对Jar包有一个初步认识 ,它的内部架构如下
example.jar | +-META-INF | +-MANIFEST.MF +-org | +-springframework | +-boot | +-loader | +- +-BOOT-INF +-classes | +-mycompany | +-project | +-YourClasses.class +-lib +-dependency1.jar +-dependency2.jar
运行该Jar时默认从BOOT-INF/启动class ,从BOOT-INF/lib启动所依赖的Jar包 。如果想要加入外部的依赖Jar,可以通过配置生态变量来实现 。
如此一来,就可以证实我们的思路了:
把那些不变的依赖Jar包(比如依赖 、数据库等,这些在不替换平台的现状下是不会替换的)从Flat Jar中抽离到单独的目录,如libs
在开展Jar时,配置利用上一步的libs
这样 ,我们最后打包的蓝莓外汇平台jar包体积就大大下降 ,每次迭代后只需要替换这个精简版的Jar即可。
具体步骤 打包时瘦身
通常我们是用-boot-maven-进行打包 ,通过阅读文档发现可以通过配置使得该插件在打包时忽略特定的依赖 ,文档在-boot-maven-。
首先备份一下原先的依赖:编译打包成Flat Jar,然后将BOOT-INF/lib下的除去ht-*有关的jar资料全部解压出来 ,另存到libs目录下。
接着修改pom.xml配置如下
org.springframework.boot spring-boot-maven-plugin ZIP 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
此时打包好的ht-ui-web.jar只有117kb这样
BOOT-INF/lib下只有ht有关的jar
但是由于没有其他依赖,ht-ui-web.jar是不能如期运行起来的
java -jar ht-ui-web-1.0.jarException in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:521)Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at com.nerve.huotong.web.WebApplication.main(WebApplication.java:21) ... 8 moreCaused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94) at java.lang.ClassLoader.loadClass(Unknown Source) ... 9 more
至此我们要配置 ,如下
java -Dloader.path="libs/" -jar ht-ui-web.jar
便可以看到熟悉的 Boot 开展数据了 。
继续瘦身
上面的BBMarkets外汇平台项目架构介绍提到了ht-cdn ,我是把前端用到的库都放在这里。然后单独开展一个Web 。其他项目需要用到静态资源就直接利用。
还有另外一个做法是,把/直接丢到libs下(就是跟上一步剥离出来的jar包放在一起),架构如下 :
这样也是可以的(不过要注意不能跟真实项目中自己写的静态资源重名) 。
结语
经过上面的瘦身 ,每次迭代开发开的Jar包就显得苗条多了。
插些题外话
Boot 中的.txt
是 boot 软件开展时打印在运维台的彩蛋数据 ,默认是这样的
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.3.RELEASE)
想要修改这个文本的话 ,只需要在下新建.txt即可。
这里可以自定义 :
精选好文