使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案
前言
springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個(gè)插件默認(rèn)情況下,會(huì)把所有的依賴包全部壓縮到一個(gè)jar里面。在有時(shí)這給我們的部署或者更新帶來(lái)很多的不方便,有的項(xiàng)目很大,最終的打包文件甚至可以達(dá)到幾百M(fèi),有時(shí)可能我們只修改了一個(gè)小bug,更新時(shí)卻要上傳幾百M(fèi)的安裝包,極度不方便,今天給大家分享幾種方案來(lái)如何減小我們的打包文件,已方便我們的更新操作。
我們構(gòu)造一個(gè)測(cè)試項(xiàng)目,具體的依賴如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
默認(rèn)情況下我們直接運(yùn)行打包命令:
mvn clean -DskipTests package
完成后,我們檢查文件大?。?/p>
有18M,下面我們來(lái)進(jìn)行瘦身處理
一、方案一(修改自帶的spring-boot-maven-plugin插件)
我們可以使用自帶的spring-boot-maven-plugin插件進(jìn)行修改,然后再配合另外兩個(gè)插件,這兩個(gè)插件就是:maven-jar-plugin和maven-dependency-plugin,可以輕松完成,下面我們來(lái)具體操作。
在pom.xml文件中的plugins節(jié)點(diǎn)下加入下面的配置:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <classesDirectory>target/classes/</classesDirectory> <archive> <manifest> <mainClass>com.example.testmvnpkgexespringboot.TestApplication</mainClass> <!-- 打包時(shí) MANIFEST.MF文件不記錄的時(shí)間戳版本 --> <useUniqueVersions>false</useUniqueVersions> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <type>jar</type> <includeTypes>jar</includeTypes> <outputDirectory> ${project.build.directory}/lib </outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--重寫包含依賴,包含不存在的依賴,jar里沒(méi)有pom里的依賴 --> <includes> <include> <groupId>null</groupId> <artifactId>null</artifactId> </include> </includes> <layout>ZIP</layout> <!--使用外部配置文件,jar包里沒(méi)有資源文件 --> <addResources>true</addResources> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins>
下面進(jìn)行打包:
mvn clean -DskipTests package
然后再查看文件大?。?/p>
我們發(fā)現(xiàn),文件只有102K,而且這里多了一個(gè)lib文件,那么要運(yùn)行這個(gè)文件,lib包就是必須的,我們直接運(yùn)行jar包進(jìn)行測(cè)試:
java -jar pkg-sb.jar
發(fā)現(xiàn)正常啟動(dòng),如果我們把lib包刪掉,在運(yùn)行,這時(shí)就會(huì)報(bào)錯(cuò)。因此我們?cè)诎l(fā)布項(xiàng)目的時(shí)候,lib和我們自己的jar必須再同級(jí)目錄下,當(dāng)然也可以修改maven-jar-plugin中的配置,大家可以自行研究。
最后我們使用assembly來(lái)制作一個(gè)ZIP發(fā)布包,assembly的配置如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>package</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <fileSet> <directory>${project.build.directory}/lib</directory> <outputDirectory>\lib</outputDirectory> </fileSet> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>\</outputDirectory> <includes> <include>pkg-sb.jar</include> </includes> </fileSet> </fileSets> </assembly>
二、方案二(使用spring-boot-thin-maven-plugin插件)
這個(gè)插件功能比較強(qiáng)大,如果你的項(xiàng)目想要弄的高大上一點(diǎn),可以選擇這個(gè)插件,我們先看下效果。
首先在項(xiàng)目的pom.xml里面加入下面配置:
<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.31.RELEASE</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-maven-plugin</artifactId> <version>1.0.31.RELEASE</version> <executions> <execution> <!-- Download the dependencies at build time --> <id>resolve</id> <goals> <goal>resolve</goal> </goals> <inherited>false</inherited> </execution> </executions> </plugin>
然后我們直接打包:
mvn clean -DskipTests package
查看打包后的結(jié)果:
這里我們看jar包只有12k,比方案一的還小,但是下面多了一個(gè)thin文件夾打開再看:
最下面的repository就是依賴的jar包。如果我們要運(yùn)行這個(gè)jar,就需要運(yùn)行thin/root下的Java包:
java -jar target/thin/root/pkg-sb.jar
運(yùn)行結(jié)果:
2024-01-31 16:51:29.955 INFO 16785 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-01-31 16:51:29.955 INFO 16785 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 635 ms 2024-01-31 16:51:30.087 INFO 16785 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2024-01-31 16:51:30.229 INFO 16785 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 12345 (http) with context path '' 2024-01-31 16:51:30.232 INFO 16785 --- [ main] c.e.t.TestApplication : Started TestApplication in 1.411 seconds (JVM running for 4.141)
說(shuō)明啟動(dòng)正常。
下面我們來(lái)講下這個(gè)插件的強(qiáng)大之處。
1、spring-boot-thin-maven-plugin的原理其實(shí)就是把我們項(xiàng)目中的所有依賴當(dāng)成轉(zhuǎn)換成maven的本地庫(kù)
2、如果目標(biāo)機(jī)上安裝了maven環(huán)境,我們可以直接來(lái)運(yùn)行jar包,這是這個(gè)jar會(huì)自動(dòng)啟動(dòng)maven來(lái)下載我們項(xiàng)目中需要的jar依賴包。你可以使用調(diào)試模式來(lái)啟動(dòng)jar,然后觀察他的啟動(dòng)過(guò)程:
調(diào)試模式啟動(dòng):
java -jar -Dthin.debug=true pkg-sb.jar
然后運(yùn)行情況如下:
[root@localhost test]# java -jar -Dthin.debug=true pkg-sb.jar Cached launcher found: /root/.m2/repository Using launcher: /root/.m2/repository/org/springframework/boot/experimental/spring-boot-thin-launcher/1.0.31.RELEASE/spring-boot-thin-launcher-1.0.31.RELEASE-exec.jar 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.ThinJarLauncher launch 信息: Version: 1.0.31.RELEASE 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver resolve 信息: Extracting dependencies from: jar:file:/root/test/pkg-sb.jar!/, with profiles [] 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties 信息: Searching for properties in: jar:file:/root/test/pkg-sb.jar!/ 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties 信息: Searching for properties in: classpath:/ 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties 信息: Searching for properties in: file:./ 1月 31, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver extract 信息: Extracting dependencies from: URL [jar:file:/root/test/pkg-sb.jar!/META-INF/maven/org.example/test-sb-lib/pom.xml], with profiles [] 1月 31, 2024 5:02:21 下午 org.springframework.boot.loader.thin.MavenSettingsReader loadSettings 信息: No settings found at: /root/.m2/settings.xml 1月 31, 2024 5:02:22 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies 信息: Computing dependencies from pom and properties 1月 31, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies 信息: Resolved: org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE=/root/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.2.5.RELEASE/spring-boot-starter-web-2.2.5.RELEASE.jar 1月 31, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies 信息: Resolved: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE=/root/.m2/repository/org/springframework/boot/spring-boot-starter/2.2.5.RELEASE/spring-boot-starter-2.2.5.RELEASE.jar 1月 31, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies
這里他自動(dòng)去下載了我們項(xiàng)目依賴的jar包并自動(dòng)存放到${user.home}/.m2 下面,
3、我們可以手動(dòng)指定依賴庫(kù)的位置,啟動(dòng)命令如下:
java -jar -Dthin.debug=true -Dthin.root=. pkg-sb.jar
這樣他會(huì)啟動(dòng)maven把依賴庫(kù)下載到我當(dāng)前的目錄下
4、還可以手動(dòng)指定去下載依賴庫(kù)的maven倉(cāng)庫(kù)地址,命令如下:
java -jar -Dthin.debug=true -Dthin.root=. -Dthin.repo=http://192.168.101.170:8081/repository/maven-public pkg-sb.jar
這里我們使用了前面我們自己搭建的私有庫(kù),因此我們能很好的去控制項(xiàng)目的運(yùn)行。
5、也可以采用離線模式去運(yùn)行,這就需要我們要把打包后產(chǎn)生的依賴一起進(jìn)行打包,這種方式和方案一的模式一樣,但是這種對(duì)目標(biāo)機(jī)就沒(méi)有maven環(huán)境的依賴,我們?cè)偈褂胊ssembly來(lái)制作一個(gè)ZIP的發(fā)布包:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>package</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <fileSet> <directory>${project.build.directory}/thin/</directory> <outputDirectory>\</outputDirectory> </fileSet> </fileSets> </assembly>
6、spring-boot-thin-maven-plugin的更多用法,大家可以參照官網(wǎng),點(diǎn)擊這里
總結(jié)
1、以上給大家分享了2中瘦身方案,反正各自都有一定的缺點(diǎn)和優(yōu)點(diǎn),大家根據(jù)實(shí)際情況進(jìn)行選擇
2、方案一比較傳統(tǒng),整個(gè)過(guò)程中規(guī)中矩,沒(méi)什么亮點(diǎn),但實(shí)用性很強(qiáng),缺點(diǎn)就是如果有新增依賴,在更新的時(shí)候就需要更新lib下的jar包,需要把新增的加入進(jìn)去。
3、方案二很有創(chuàng)意,而且功能很強(qiáng)大,能玩出很多姿勢(shì)來(lái),如果采用離線模式也就和方案一沒(méi)區(qū)別,采用在線模式缺點(diǎn)就是要依賴maven環(huán)境,但是也可以將maven和項(xiàng)目整個(gè)打包,然后編寫腳本來(lái)實(shí)現(xiàn)自帶maven環(huán)境。大家可以自己去嘗試。
4、這兩種方式都能實(shí)現(xiàn)對(duì)springboot項(xiàng)目的瘦身處理,對(duì)更新來(lái)說(shuō)方便很多。
5、如果有自己的私有庫(kù),我們可以把項(xiàng)目進(jìn)行分模塊化處理,核心業(yè)務(wù)用一個(gè)單獨(dú)的jar來(lái)實(shí)現(xiàn),這樣方案二能利用maven實(shí)現(xiàn)優(yōu)雅更新
6、雖然有的同學(xué)會(huì)想到利用docker來(lái)運(yùn)行,對(duì)更新來(lái)說(shuō)也很方便,其實(shí)方式二也將maven環(huán)境打入docker鏡像,然后利用在線模式來(lái)運(yùn)行,這樣可以大大減少docker鏡像的大小,后面的章節(jié)我們可以繼續(xù)來(lái)研究
以上就是使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案的詳細(xì)內(nèi)容,更多關(guān)于maven對(duì)springboot瘦身分離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法
- SpringBoot使用classfinal-maven-plugin插件加密Jar包的示例代碼
- SpringBoot Maven升級(jí)自帶的jar包版本問(wèn)題
- maven?springboot如何將jar包打包到指定目錄
- springboot maven 項(xiàng)目打包jar 最后名稱自定義的教程
- SpringBoot使用Maven打包異常-引入外部jar的問(wèn)題及解決方案
- maven+springboot打成jar包的方法
- IDEA在SpringBoot項(xiàng)目使用Maven打包后jar包太小問(wèn)題及解決
相關(guān)文章
使用@Value 注入 List 類型的配置屬性需要注意的 BUG
這篇文章主要介紹了使用@Value 注入 List 類型的配置屬性需要注意的 BUG,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08springboot json時(shí)間格式化處理的方法
這篇文章主要介紹了springboot json時(shí)間格式化處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07springboot掃描自定義的servlet和filter代碼詳解
本文是一篇根據(jù)作者工作經(jīng)歷總結(jié)出來(lái)的關(guān)于springboot掃描自定義的servlet和filter代碼詳解的文章,小編覺得非常不錯(cuò),這里給大家分享下,和朋友們一起學(xué)習(xí),進(jìn)步。2017-10-10