springboot-assembly自定義打包全過程
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格式,填寫zip -->
<format>tar.gz</format>
</formats>
<!-- 如果為true,打包出來的文件結(jié)構(gòu)第一層為pom.xml里面定義的artifactId-version -->
<includeBaseDirectory>true</includeBaseDirectory>
<!--fileSets 可以設(shè)置文件被打包的具體配置??梢赃^濾哪些文件被打包-->
<fileSets>
<fileSet>
<!--資源目錄-->
<directory>doc</directory>
<includes>
<!--過濾哪些文件被打包-->
<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>
<!--過濾掉不希望包含在jar中的文件-->
<excludes>
<!-- 排除不需要的文件夾(路徑是jar包內(nèi)部的路徑) -->
<exclude>**/assembly/</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>說明: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í)通信的問題小結(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-11
Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法
數(shù)組是java中一個(gè)重要的類型,小伙伴們知道如何將數(shù)組轉(zhuǎn)為字符串嗎,這篇文章主要給大家介紹了關(guān)于Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法,需要的朋友可以參考下2024-03-03
Java通過工廠、Map容器創(chuàng)建對(duì)象的方法
這篇文章主要介紹了Java通過工廠、Map容器創(chuàng)建對(duì)象的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java使用Calendar類實(shí)現(xiàn)動(dòng)態(tài)日歷
這篇文章主要為大家詳細(xì)介紹了Java使用Calendar類實(shí)現(xiàn)動(dòng)態(tài)日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java實(shí)現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼
我們?cè)趯?shí)際開發(fā)中,肯定會(huì)用到樹結(jié)構(gòu),如部門樹、菜單樹等等。Java后臺(tái)利用遞歸思路進(jìn)行構(gòu)建樹形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進(jìn)行展示。今天,咱們就來說說怎么樣將List集合轉(zhuǎn)換成TreeList2022-11-11
Java使用MessageFormat應(yīng)注意的問題
這篇文章主要介紹了Java使用MessageFormat應(yīng)注意的問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-06-06
Java實(shí)現(xiàn)導(dǎo)出Word文檔的示例代碼
poi-tl是一個(gè)基于Apache POI的Word模板引擎,也是一個(gè)免費(fèi)開源的Java類庫(kù),你可以非常方便的加入到你的項(xiàng)目中。本文就利用它實(shí)現(xiàn)導(dǎo)出Word文檔功能,需要的可以參考一下2023-02-02

