springboot-assembly自定義打包全過(guò)程
springboot-assembly自定義打包
我們打包項(xiàng)目的時(shí)候,一般只會(huì)打出一個(gè)可執(zhí)行jar。有時(shí),這個(gè)jar需要附帶啟動(dòng)腳本或外置配置文件。此時(shí)就可以使用assembly自定義打包。
使用場(chǎng)景:按照自己的需求將需要的文件打包到自己指定的目錄。
配置maven-assembly-plugin
放到要打包的pom.xml中
<build> <finalName>sb-my</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--<version>1.3.3.RELEASE</version>--> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> <executions> <execution> <goals> <!--repackage,其在Maven的package生命周期階段,能夠?qū)vn package生成的軟件包,再次打包為可執(zhí)行的軟件包,并將mvn package生成的軟件包重命名為*.original--> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <!--appendAssemblyId: 打包后的包名是否包含assembly的id名,assembly的配置在后面介紹;--> <id>make-assembly</id> <!--execution:phase加入package后,則在執(zhí)行maven package時(shí)就可以調(diào)用maven-assembly-plugin插件定義的打包方式。--> <phase>package</phase> <goals> <!--只執(zhí)行一次--> <goal>single</goal> </goals> </execution> </executions> <configuration> <finalName>sb-my-${version}</finalName> <archive> <manifest> <mainClass>cn.demo.Application</mainClass> </manifest> </archive> <descriptors> <!--descriptor:引用的assembly配置文件,可以用多個(gè),即可以同時(shí)打包多個(gè)格式的包;--> <descriptor>src/main/resources/assembly/assembly.xml</descriptor> </descriptors> <appendAssemblyId>false</appendAssemblyId> </configuration> </plugin> </plugins> </build>
自定義打包配置文件assembly.xml
在src/main/resources/assembly/下新建assembly.xml
<assembly> <id>assembly</id> <formats> <!-- 打包成tar.gz格式,如果需要打包成zip格式,填寫(xiě)zip --> <format>tar.gz</format> </formats> <!-- 如果為true,打包出來(lái)的文件結(jié)構(gòu)第一層為pom.xml里面定義的artifactId-version --> <includeBaseDirectory>true</includeBaseDirectory> <!--fileSets 可以設(shè)置文件被打包的具體配置。可以過(guò)濾哪些文件被打包--> <fileSets> <fileSet> <!--資源目錄--> <directory>doc</directory> <includes> <!--過(guò)濾哪些文件被打包--> <include>*.sh</include> </includes> <!-- 輸出到當(dāng)前目錄 --> <outputDirectory>.</outputDirectory> <!-- 所有文件權(quán)限為755 --> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>doc/sql</directory> <includes> <include>*.sql</include> </includes> <outputDirectory>./doc/sql</outputDirectory> </fileSet> <fileSet> <directory>doc</directory> <includes> <include>*.docx</include> </includes> <outputDirectory>./doc</outputDirectory> </fileSet> <!-- <fileSet> <directory>src/main/resources/</directory> <includes> <include>application.properties</include> <include>java.env</include> </includes> <outputDirectory>.</outputDirectory> </fileSet>--> </fileSets> <files> <file> <source>src/main/resources/application.properties</source> <!--重命名文件--> <destName>config.properties</destName> <outputDirectory>.</outputDirectory> </file> <file> <!--jar文件是直接從target目錄下拷貝然后輸出到當(dāng)前包中的--> <source>target/sb-my.jar</source> <outputDirectory>.</outputDirectory> </file> </files> </assembly>
效果
springboot基于assembly插件打包
assembly打包的優(yōu)點(diǎn)
讓springboot能夠加載jar外的配置文件。
方便提供一個(gè)服務(wù)化的啟動(dòng)腳本。
pom定義
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <!--<configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration>--> <executions> <execution> <id>bundle</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- <appendAssemblyId>false</appendAssemblyId> --> <descriptors> <descriptor>${basedir}/src/main/build/assembly.xml</descriptor> </descriptors> <!-- 打包后的文件生成目錄--> <!--<outputDirectory>${project.build.directory}/dist/</outputDirectory>--> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <!--main啟動(dòng)類--> <mainClass>com.test.WorkWebApplication</mainClass> <!--生成的manifest中classpath的前綴,因?yàn)橐训谌絡(luò)ar放到lib目錄下,所以classpath的前綴是lib/--> <classpathPrefix>lib/</classpathPrefix> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Class-Path>conf/</Class-Path> </manifestEntries> </archive> <!--過(guò)濾掉不希望包含在jar中的文件--> <excludes> <!-- 排除不需要的文件夾(路徑是jar包內(nèi)部的路徑) --> <exclude>**/assembly/</exclude> </excludes> </configuration> </plugin> </plugins> </build>
說(shuō)明:assembly.xml存放于src/main/build目錄,此外用于發(fā)布的config、bin目錄及文件都放到這個(gè)目錄;
具體內(nèi)容:
<assembly> <id>1.0</id> <formats> <format>tar.gz</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!-- config files --> <fileSet> <directory>${basedir}/src/main/resources</directory> <outputDirectory>/conf</outputDirectory> <includes> <include>*.xml</include> <include>*.properties</include> <include>*.yml</include> <include>*.key</include> <include>dev/*</include> <include>prod/*</include> <include>test/*</include> </includes> <fileMode>0644</fileMode> <lineEnding>unix</lineEnding> </fileSet> <fileSet> <directory>target</directory> <outputDirectory>/</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <!-- scripts --> <fileSet> <directory>${basedir}/src/main/build/bin</directory> <includes> <include>*.sh</include> </includes> <fileMode>0755</fileMode> <outputDirectory>/bin</outputDirectory> </fileSet> <!-- executable jar --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>/</outputDirectory> <includes> <include>${project.artifactId}-${project.version}.jar</include> <!--<include>${project.artifactId}-${project.version}-jar-with-dependencies.jar</include>--> </includes> <fileMode>0755</fileMode> </fileSet> </fileSets> </assembly>
執(zhí)行mvn clean package -Dmaven.test.skip=true 打包
出現(xiàn)如下錯(cuò)誤:
因?yàn)槭窃趙indows上執(zhí)行assembly任務(wù),但是它包含了相對(duì)于linux的路徑。
解決方案:將outputDirectory節(jié)點(diǎn)直接閉合;或是在linux目錄前加一個(gè)點(diǎn)?;蛘吒某?{file.separator}
因此將上述腳本改成如下
<assembly> <id>1.0</id> <formats> <format>tar.gz</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!-- config files --> <fileSet> <directory>src/main/resources/</directory> <outputDirectory>${file.separator}conf</outputDirectory> </fileSet> <fileSet> <directory>bin/</directory> <outputDirectory>${file.separator}</outputDirectory> </fileSet> <fileSet> <directory>target</directory> <outputDirectory>${file.separator}</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <!-- scripts --> <fileSet> <directory>${basedir}/src/main/build/bin</directory> <includes> <include>*.sh</include> </includes> <fileMode>0755</fileMode> <outputDirectory>${file.separator}bin</outputDirectory> </fileSet> <!-- executable jar --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>${file.separator}</outputDirectory> <includes> <include>${project.artifactId}-${project.version}.jar</include> <!--<include>${project.artifactId}-${project.version}-jar-with-dependencies.jar</include>--> </includes> <fileMode>0755</fileMode> </fileSet> </fileSets> </assembly>
繼續(xù)執(zhí)行打包命令,格式如下:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot3中Spring?WebFlux?SSE服務(wù)器發(fā)送事件的實(shí)現(xiàn)步驟
- Android?Springboot?實(shí)現(xiàn)SSE通信案例詳解
- Spring?Boot整合Kafka+SSE實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)展示
- Spring Boot中使用Server-Sent Events (SSE) 實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送教程
- Springboot集成SSE實(shí)現(xiàn)單工通信消息推送流程詳解
- Spring Boot整合SSE實(shí)時(shí)通信的問(wèn)題小結(jié)
相關(guān)文章
Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔
這篇文章主要為大家詳細(xì)介紹了Java如何使用Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法
數(shù)組是java中一個(gè)重要的類型,小伙伴們知道如何將數(shù)組轉(zhuǎn)為字符串嗎,這篇文章主要給大家介紹了關(guān)于Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法,需要的朋友可以參考下2024-03-03Java通過(guò)工廠、Map容器創(chuàng)建對(duì)象的方法
這篇文章主要介紹了Java通過(guò)工廠、Map容器創(chuàng)建對(duì)象的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java使用Calendar類實(shí)現(xiàn)動(dòng)態(tài)日歷
這篇文章主要為大家詳細(xì)介紹了Java使用Calendar類實(shí)現(xiàn)動(dòng)態(tài)日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Java實(shí)現(xiàn)遞歸查詢樹(shù)結(jié)構(gòu)的示例代碼
我們?cè)趯?shí)際開(kāi)發(fā)中,肯定會(huì)用到樹(shù)結(jié)構(gòu),如部門樹(shù)、菜單樹(shù)等等。Java后臺(tái)利用遞歸思路進(jìn)行構(gòu)建樹(shù)形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進(jìn)行展示。今天,咱們就來(lái)說(shuō)說(shuō)怎么樣將List集合轉(zhuǎn)換成TreeList2022-11-11Java使用MessageFormat應(yīng)注意的問(wèn)題
這篇文章主要介紹了Java使用MessageFormat應(yīng)注意的問(wèn)題,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-06-06通過(guò)一個(gè)map替換字符串中指定的字符變量方法
下面小編就為大家?guī)?lái)一篇通過(guò)一個(gè)map替換字符串中指定的字符變量方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Java實(shí)現(xiàn)導(dǎo)出Word文檔的示例代碼
poi-tl是一個(gè)基于Apache POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類庫(kù),你可以非常方便的加入到你的項(xiàng)目中。本文就利用它實(shí)現(xiàn)導(dǎo)出Word文檔功能,需要的可以參考一下2023-02-02