springboot-assembly自定義打包全過程
springboot-assembly自定義打包
我們打包項目的時候,一般只會打出一個可執(zhí)行jar。有時,這個jar需要附帶啟動腳本或外置配置文件。此時就可以使用assembly自定義打包。
使用場景:按照自己的需求將需要的文件打包到自己指定的目錄。
配置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時就可以調(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配置文件,可以用多個,即可以同時打包多個格式的包;--> <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> <!-- 輸出到當前目錄 --> <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目錄下拷貝然后輸出到當前包中的--> <source>target/sb-my.jar</source> <outputDirectory>.</outputDirectory> </file> </files> </assembly>
效果
springboot基于assembly插件打包
assembly打包的優(yōu)點
讓springboot能夠加載jar外的配置文件。
方便提供一個服務化的啟動腳本。
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啟動類--> <mainClass>com.test.WorkWebApplication</mainClass> <!--生成的manifest中classpath的前綴,因為要把第三方jar放到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目錄及文件都放到這個目錄;
具體內(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)如下錯誤:
因為是在windows上執(zhí)行assembly任務,但是它包含了相對于linux的路徑。
解決方案:將outputDirectory節(jié)點直接閉合;或是在linux目錄前加一個點?;蛘吒某?{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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java+Freemarker實現(xiàn)根據(jù)XML模板文件生成Word文檔
這篇文章主要為大家詳細介紹了Java如何使用Freemarker實現(xiàn)根據(jù)XML模板文件生成Word文檔,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下2023-11-11Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法
數(shù)組是java中一個重要的類型,小伙伴們知道如何將數(shù)組轉(zhuǎn)為字符串嗎,這篇文章主要給大家介紹了關(guān)于Java中數(shù)組如何轉(zhuǎn)為字符串的幾種方法,需要的朋友可以參考下2024-03-03Java使用Calendar類實現(xiàn)動態(tài)日歷
這篇文章主要為大家詳細介紹了Java使用Calendar類實現(xiàn)動態(tài)日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07Java實現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼
我們在實際開發(fā)中,肯定會用到樹結(jié)構(gòu),如部門樹、菜單樹等等。Java后臺利用遞歸思路進行構(gòu)建樹形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進行展示。今天,咱們就來說說怎么樣將List集合轉(zhuǎn)換成TreeList2022-11-11