SpringBoot多種生產(chǎn)打包方式詳解
Springboot 多種生產(chǎn)打包方式簡介
生產(chǎn)上發(fā)布 Spring Boot 項目時,流程頗為繁瑣且低效。但凡代碼有一丁點改動,就得把整個項目重新打包部署,耗時費力不說,生成的 JAR 包還特別臃腫,體積龐大。每次更新項目,光是上傳這大文件就得花費不少時間,嚴重影響工作節(jié)奏。為解決這一痛點,我打算把依賴庫以及配置文件(lib 文件夾下的那些 jar 包, 還有 config 下的 applacation.yml 等文件)從項目主體里剝離出來,后續(xù)部署時,只需發(fā)布核心代碼就行,這樣既能加快部署速度,又能減輕文件傳輸負擔,讓項目更新變得輕松便捷
方法一 插件 spring-boot-maven-plugin
1. 項目應用的配置文件排除 統(tǒng)一打包到 config 目錄下
利用 springboot 中 resource 插件來排除配置,并統(tǒng)一打包到 config 目錄下
<resources> <resource> <directory>src/main/resources</directory> <!--filerting設置為true,則打包過程中會對這些文件進行過濾處理--> <filtering>true</filtering> <!--指定目標路徑為config--> <targetPath>${project.build.directory}/config</targetPath> <includes> <!--使用通配符--> <include>**/*.properties</include> <include>**/*.yml</include> <include>**/*.xml</include> <include>mapper/*.xml</include> <!-- 這里可以根據(jù)你實際想要包含的配置文件類型來添加更多的include配置 --> </includes> </resource> </resources>
2. 把我們寫代碼打包可執(zhí)行 jar,并排除依賴 jar 包
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--項目的啟動類,如果有多個main就必須指定,沒有可以缺失 <mainClass>XXXXX.TwinWebApplication</mainClass>--> <!--解決windows命令行窗口中文亂碼--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <layout>ZIP</layout> <!--配置需要打包進項目的jar--> <includes> <!--填寫需要打包所需要的依賴 。沒有匹配上任何jar包機排除依賴--> <include> <groupId>no-exists-jar</groupId> <artifactId>non-exists-jar</artifactId> </include> </includes> </configuration> <executions> <execution> <goals> <!-- 表示當運行mavn package打包時,使用Springboot插件打包 --> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
3 配置依賴的 jar 包 統(tǒng)一打包 lib 目錄
<!--此插件用于將依賴包抽出--> <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> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin>
打包后目錄結(jié)構(gòu), 如下圖所示
執(zhí)行命令 java -jar -Dloader.path=./lib -jar xxx.jar
注意
springboot 啟動時候會優(yōu)先讀取 config 目錄下配置文件 所以這里不用指定 - Dspring.config.location=XX.yml 文件
注意
例如日志文件配置以及 mybits 等配置文件 可以配成絕對路徑 如下所示:
方法二 使用 maven-jar-plugin 插件實現(xiàn)
1 使用插件 maven-resources-plugin 處理配置文件打包到 config 目錄
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <!--配置文件打包成config目錄下 --> <outputDirectory>${project.build.directory}/twin-web/config</outputDirectory> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> </configuration> </execution> </executions> </plugin>
2. 使用 maven-jar-plugin 打包可執(zhí)行 jar 并排除依賴
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <outputDirectory> <!--輸入打包可執(zhí)行的jar到twin-web\libs\下--> ${project.build.directory}/twin-web/ </outputDirectory> <archive> <addMavenDescriptor>false</addMavenDescriptor> <manifest> <addClasspath>true</addClasspath> <!-- 增加執(zhí)行啟動jar的依賴jar包目錄前綴--> <classpathPrefix>./libs/</classpathPrefix> <!-- 指定啟動類--> <mainClass>com.keqing.twinweb.TwinWebApplication</mainClass> </manifest> <manifestEntries> <!-- 增加配置文件的classpath--> <Class-Path>./config/</Class-Path> </manifestEntries> </archive> <!-- 排除配置文件--> <excludes> <exclude>*.yml</exclude> <exclude>mapper/**</exclude> <exclude>*.xml</exclude> </excludes> </configuration> </plugin>
3 使用 maven-dependency-plugin 打包 libs 目錄下
<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> <outputDirectory>${project.build.directory}/twin-web/libs</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin>
使用 package 打包后的目錄
查看自己打包后 jar 目錄,注意這種打包方式弊端,按照一定約定格式規(guī)范固定了,一旦依賴 jar 包(包括配置文件目錄等)發(fā)生變化就必須重新打包
啟動程序 java -jar xxx.jar
方式三 使用 maven-assembly-plugin 打包
maven-assembly-plugin
是 Maven 中的一個插件,它允許用戶將項目的輸出以及依賴、模塊、站點文檔和其他文件打包成一個可發(fā)布的格式,例如 zip、tar.gz、jar 等。以下是使用 maven-assembly-plugin
的一些優(yōu)勢:
- 自定義打包格式:
maven-assembly-plugin
允許你通過定義描述符文件(descriptor)來完全自定義打包的內(nèi)容和格式。你可以選擇包含或排除特定的文件和目錄。 - 一鍵打包:通過一個簡單的 Maven 命令,你可以創(chuàng)建一個包含所有必需依賴的單一歸檔文件,這使得分發(fā)和部署變得非常簡單。
- 多環(huán)境支持:可以為不同的環(huán)境(開發(fā)、測試、生產(chǎn))創(chuàng)建不同的打包配置,使得環(huán)境遷移更加容易。
- 依賴管理:插件會自動處理項目依賴,將它們打包到最終的歸檔文件中,無需手動管理。
- 模塊化項目支持:對于多模塊項目,
maven-assembly-plugin
可以將所有模塊的輸出合并到一個歸檔文件中。 - 預配置的描述符:插件提供了一些預定義的描述符,如
bin
、jar-with-dependencies
等,可以直接使用,無需自定義。 - 靈活性:你可以通過修改描述符文件來調(diào)整打包行為,以適應不同的需求。
- 集成性:
maven-assembly-plugin
與 Maven 生態(tài)系統(tǒng)緊密集成,可以與其他 Maven 插件協(xié)同工作。 - 文檔和社區(qū)支持:由于
maven-assembly-plugin
是 Maven 的一部分,因此有廣泛的文檔和社區(qū)支持。
1. 項目應用的配置文件排除
<resources> <resource> <directory>src/main/resources</directory> <!--filerting設置為true,則打包過程中會對這些文件進行過濾處理--> <filtering>true</filtering> <includes> <!--使用通配符--> <include>**/*.properties</include> <include>**/*.yml</include> <include>**/*.xml</include> <include>mapper/*.xml</include> <!-- 這里可以根據(jù)你實際想要包含的配置文件類型來添加更多的include配置 --> </includes> </resource> </resources>
2. 配置 spring-boot-maven-plugin
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--項目的啟動類,如果有多個main就必須指定,沒有可以缺失 <mainClass>XXXXX.TwinWebApplication</mainClass>--> <!--解決windows命令行窗口中文亂碼--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <layout>ZIP</layout> <!--配置需要打包進項目的jar--> <includes> <!--填寫需要打包所需要的依賴 。沒有匹配上任何jar包機排除依賴--> <include> <groupId>no-exists-jar</groupId> <artifactId>non-exists-jar</artifactId> </include> </includes> </configuration> <executions> <execution> <goals> <!-- 表示當運行mavn package打包時,使用Springboot插件打包 --> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
3 引入 springboot 里約定 maven-assembly-plugin
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!-- 打包文件名字不包含 assembly.xml 中 id --> <appendAssemblyId>false</appendAssemblyId> <descriptors> <!--項目所在目錄配置文件的 assembly.xml文件 --> <descriptor>assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置 assembly.xml 文件
<assembly> <!-- 打包文件名的標識符,用來做后綴--> <id>make-assembly</id> <!-- 打包的類型,如果有N個,將會打N個類型的包 --> <formats> <format>tar.gz</format> <format>zip</format> </formats> <!-- 壓縮包下是否生成和項目名相同的根目錄 --> <includeBaseDirectory>true</includeBaseDirectory> <!-- 用來設置一組文件在打包時的屬性。--> <fileSets> <!-- 0755->即用戶具有讀/寫/執(zhí)行權(quán)限,組用戶和其它用戶具有讀寫權(quán)限;--> <!-- 0644->即用戶具有讀寫權(quán)限,組用戶和其它用戶具有只讀權(quán)限;--> <!-- 將src/bin目錄下的jar啟動腳本輸出到打包后的目錄中 --> <fileSet> <!--lineEnding選項可用于控制給定的行結(jié)束文件 --> <lineEnding>unix</lineEnding> <directory>${basedir}/bin</directory> <outputDirectory>${file.separator}</outputDirectory> <fileMode>0755</fileMode> <includes> <include>**.sh</include> <include>**.bat</include> </includes> </fileSet> <!-- 把項目的配置文件,打包進壓縮文件的config目錄 --> <fileSet> <directory>${basedir}/src/main/resources</directory> <outputDirectory>config</outputDirectory> <fileMode>0644</fileMode> <includes> <include>*.properties</include> <include>*.yml</include> <include>*.xml</include> <include>mapper/*.xml</include> </includes> </fileSet> <!-- 把項目自己編譯出來的jar文件,打包進zip文件的根目錄 --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>${file.separator}</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets> <!-- 依賴包的拷貝--> <dependencySets> <dependencySet> <unpack>false</unpack> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <scope>provided</scope> </dependencySet> <dependencySet> <unpack>false</unpack> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <scope>system</scope> </dependencySet> <dependencySet> <unpack>false</unpack> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
打包后目錄
解壓 zip 目錄查看
使用命令啟動項目 java -jar -Dloader.path=./lib -jar xxx.jar
以上就是SpringBoot多種生產(chǎn)打包方式詳解的詳細內(nèi)容,更多關(guān)于SpringBoot生產(chǎn)打包的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Security如何使用URL地址進行權(quán)限控制
這篇文章主要介紹了Spring Security如何使用URL地址進行權(quán)限控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12Java 實戰(zhàn)交易平臺項目之寵物在線商城系統(tǒng)
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個寵物在線商城系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11詳解springmvc之json數(shù)據(jù)交互controller方法返回值為簡單類型
這篇文章主要介紹了springmvc之json數(shù)據(jù)交互controller方法返回值為簡單類型,非常具有實用價值,需要的朋友可以參考下2017-05-05springboot 多模塊將dao(mybatis)項目拆分出去
這篇文章主要介紹了springboot 多模塊將dao(mybatis)項目拆分出去,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05