前提概要
最近我們項目越來越多了,然后我就在想如何才能把基礎服務的打包方式統一起來,並且可以實現按照我們的要求來生成,通過研究,我們通過使用maven的assembly插件完美的實現了該需求,爽爆了有木有。本文分享該插件的配置以及微服務的統一打包方式。
maven-assembly-plugin打包插件
配置步驟及其他事項
首先我們需要在pom.xml中配置maven的assembly插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<!-- 配置執行器 -->
<execution>
<id>make-assembly</id>
<!-- 綁定到package生命周期階段上 -->
<phase>package</phase>
<goals>
<!-- 只運行一次 -->
<goal>single</goal>
</goals>
<configuration>
<!--生成包的末尾添加assembly id,一般關閉 -->
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-${project.version}</finalName>
<!--加載指定的配置文件-->
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置參數介紹說明
- execution:配置執行器
- phase:綁定到package生命周期階段上
- goal:{single}:只運行一次
- configuration->appendAssemblyId:生成包的末尾添加assembly id,一般關閉
- descriptor:src/main/assembly/assembly.xml:后續會講解,主要用於描述如何進行打包的規則。
自定義格式包assembly.xml
接着我們在src/main/assembly文件中配置assembly.xml文件
<assembly>
<id>唯一編號</id>
<formats>
<!--打包的文件格式,也可以有:war zip-->
<format>tar.gz</format>
</formats>
<!--tar.gz壓縮包下是否生成和項目名相同的根目錄-->
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>/</outputDirectory>
<!-- Linux權限 -->
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>target/classes/META-INF/conf</directory>
<outputDirectory>conf/META-INF/conf</outputDirectory>
<!-- Linux權限 -->
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>conf</outputDirectory>
<fileMode>0644</fileMode>
<includes><!-- 只負責這些目標文件-->
<include>*.properties</include>
<include>*.xml</include>
</includes>
</fileSet>
</fileSets>
<!-- 輸出到lib路徑 -->
<dependencySets>
<dependencySet>
<!--是否在最外層套一個本項目的名稱的文件目錄-->
<useProjectArtifact>true</useProjectArtifact>
<!-- 輸出到這個路徑下 -->
<outputDirectory>lib</outputDirectory>
<!--將scope為runtime的依賴包打包-->
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
-
生成的lib文件夾下放該項目的所有依賴以及該服務jar包,src/main/bin文件夾下我們一般放start.sh和stop.sh兩個腳本文件用來開啟和關閉該服務,打包后直接放到根目錄下。
-
生成的tar.gz文件的名字為:[maven-assembly-plugin插件中配置的finalName]-[assembly.xml配置的id(若assembly中沒有指定id,則只有前半部分)].
-
所以:maven-compiler-plugin是用來將代碼生成jar的工具,maven-assembly-plugin是用來生成指定格式的工具。
-
配置完成后進入標簽里指定的位置建xml文件,這里是src/assembly/assembly-descriptor.xml,內容如下:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>my-assembly</id>
<formats>
<!--打包生成后的格式 -->
<format>zip</format>
</formats>
<!-- -->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<!--腳本所在的文件夾,以及打包后將腳本輸出到哪個文件夾中 -->
<directory>src/scripts</directory>
<outputDirectory>alarm/bin</outputDirectory>
<!-- 哪些文件會被提取 -->
<includes>
<include>*.sh</include>
</includes>
<!-- 文件權限及編碼 -->
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet>
<fileSet>
<!--同上,這里配置的是配置文件所在的文件夾 -->
<directory>src/main/resources</directory>
<outputDirectory>alarm/conf</outputDirectory>
<includes>
<include>*.yml</include>
</includes>
<lineEnding>unix</lineEnding>
</fileSet>
<!--artifact -->
<fileSet>
<!--這里的target是maven-compiler-plugin生成該項目的jar包的位置 -->
<directory>target</directory>
<outputDirectory>alarm/lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<!--這里是將該項目依賴的所有jar包存入lib文件夾中 -->
<outputDirectory>alarm/lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<useProjectAttachments>true</useProjectAttachments>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
啟動腳本
在完成以上配置后,只需在指定的位置建立scripts/start.sh和stop.sh兩個腳本即可完成。具體啟動腳本如下:
start.sh啟動文件腳本
#!/bin/sh
basepath=$(cd `dirname $0`;cd '../'; pwd)
echo "path:"$basepath
jarHome='/my.jar'
echo "Starting my service"
ls_date=`date +%Y%m%d`
if [ ! -d "${basepath}/log" ]; then
mkdir ${basepath}/log
fi
if [ ! -d "$basepath/log/${ls_date}" ]; then
mkdir $basepath/log/${ls_date}
fi
nohup java -jar $basepath$jarHome --spring.config.location=$basepath/conf/server-attach.yml,$basepath/conf/server-shared.yml> $basepath/log/${ls_date}/${ls_date}.log &
#####
主要命令是獲取當天日期,然后在log文件夾下建立指定日期的文件夾,並將日志存放進去。其中–spring.config.location用於加載指定的配置文件,多個配置文件用逗號分割。
stop.sh停止文件腳本
停止腳本通過ps -ef獲取進程id然后kill,如下:
#!/bin/sh
my=`ps -ef |grep my.jar | grep -v grep | awk '{print $2}'`
kill -9 $my
結語
以上配置完成后使用mvn package命令即可自動打成一個zip壓縮包,包內包含bin、conf、lib文件夾,可用啟動腳本一鍵啟動。實際上這里能修改的地方還有很多,包括啟動腳本也可以用其他方式如java -classpath方式啟動等等,具體的可以根據自身需求進行相應修改。