我们的项目是基于Spring Boot 开发的,所以打包时用的插件也是spring-boot-maven-plugin,打包的jar直接就可以使用 nohup java -jar xxxx.jar& 运行,很方便。但问题是:jar包太大,上传很慢。所有的依赖都在这个jar包里,重点是除了我们项目自身引用的模块会改变,其余第三方的依赖只要版本定了基本都不会再改变,所以我们的目标就是将那些不变的剔除出去。
首先使用Maven-dependency-plugin插件将所有的jar包打包到指定的文件夹:
如果Maven clean install的时候没有出错,在jar包的Boot-INF 包里面会有lib文件夹(也可以指定到其他的文件夹),里面就是全部的依赖。
将lib压缩后上传的服务器指定的目录,并使用unzip 命令解压,默认解压到当前的目录(还可以使用 -d 参数解压到指定的文件夹下), ----( 此处有坑,下面有填坑的方法);
在将pom文件里面的Maven-dependency-plugin查件注释掉,只使用spring boot 的插件,并使用 <includes>将自己项目的模块包含进来,因为自己项目的模块在开发的过程中会改变。如图:
自己项目的模块有引用那些就都包含进来。
此时在运行 Maven clean install ,在看打不来的包会很小,因为lib文件夹下只有我们包含进来的jar包,准确的说:只有我们自己项目以及自己模块的jar包,非常的小。
这时候就换一种启动命令:
nohup java -Dloader.path="xxxxxx" -jar xxxx.jar &
双引号下填写的是:刚才你上传lib文件相对于当前的路径;告诉机器启动的时候去哪个地方加载额外的依赖。
按照以上方法,再次启动的时候,还是启动不成功,报的错误是:部分内容已经加载过了或者xml文件资源重复之类的错误;这时找到lib文件夹,仔细查看会发现里面有我们自己的模块的依赖,这个跟我们使用<includes>打包出来的jar里面的有重复,只要将lib 文件夹下的模块删除就ok了。
以后在启动的时候只要使用 nohup java -Dloader.path="xxxxxx" -jar xxxx.jar & 就可以了;
上面的方式适用于服务器的操作权或者部分操作权的在开发这边的,如果开发没有操作权或者运维不配合,那就还是使用fat jar 好了。