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)文章
在Web項(xiàng)目中手機(jī)短信驗(yàn)證碼實(shí)現(xiàn)的全過(guò)程記錄
這篇文章主要給大家介紹了關(guān)于在Web項(xiàng)目中實(shí)現(xiàn)短信驗(yàn)證碼的全過(guò)程記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),在文末跟大家提供了源碼下載,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java下http下載文件客戶端和上傳文件客戶端實(shí)例代碼
這篇文章主要介紹了Java下http下載文件客戶端和上傳文件客戶端實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12
詳解SpringBoot結(jié)合swagger2快速生成簡(jiǎn)單的接口文檔
這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡(jiǎn)單的接口文檔,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
spring cloud Hystrix斷路器的使用(熔斷器)
這篇文章主要介紹了spring cloud Hystrix斷路器的使用(熔斷器),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Spring IOC創(chuàng)建對(duì)象的兩種方式
這篇文章主要給大家介紹了關(guān)于Spring IOC創(chuàng)建對(duì)象的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
mybatis generator只能生成insert和selectAll的操作
這篇文章主要介紹了mybatis generator只能生成insert和selectAll的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
解決spring @ControllerAdvice處理異常無(wú)法正確匹配自定義異常
這篇文章主要介紹了解決spring @ControllerAdvice處理異常無(wú)法正確匹配自定義異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

