1.问题来源
项目搭建完成之后,往往需要打成Jar包进行部署。单模块项目还好,但是一旦遇到多模块项目,打完之后每个能启动的模块都会有一个Jar包,为了保证Jar包能够单独启动,Maven会将所有在pom.xml里面关联的依赖(包括继承自父模块)都整合进Jar包。
这样会带来一个问题,打出的Jar包体积比较大,但这几个项目引入的外部差异化Jar包可能并不是很多,有很多Jar包其实是可以共用的(比如spring自带的启动包),在同一个地点部署的前提下,每个Jar包里面都包含这些依赖包其实是重复的。那么有什么办法能够使这些依赖进行复用呢,今天我们就来探讨一下这个问题。
2.手动去除插件
我们可能会想到既然公共的Jar包重复了,那么就直接去除公共Jar包就行了。而在spring boot maven里面,给出的去除方法是这样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <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包都得自己手动去除.....
我们当然要寻找更好的解决方案,事实上的确有更好的替代,那就是下面提到的插件。
3.利用插件帮助去除依赖
我们可以在项目的启动类(如果有多个启动类那就在这些启动类的总父类)里添加这样一个插件
1 2 3 4 5 6 7 8 9 10 11 12 | <!--jar包压缩插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-layout</artifactId> <version> 1.0 . 8 .RELEASE</version> </dependency> </dependencies> </plugin> |
然后我们打完包就会发现jar包神奇的变成了
体积骤降的原因是因为其中的依赖包都被剥离了,自然这样的包是不能直接运行的,会报错
我们需要在jar包同级目录下运行指令
1 | java -Dthin.root=lib -jar IDKProxy.jar |
这样根据插件打出的jar包会自动的下载依赖到你用Dthin.root指定的文件夹中
程序也会自动运行,在存在加载好的lib依赖包的前提下,下次直接运行只要直接:java -jar jar包名 就可以直接运行了
如果其他jar包依赖相同,那也可以直接运行,不同的话只要将不同的依赖放入lib就行了