Apache Maven Assembly自定義打包插件的使用
概述
是什么:Apache Maven Assembly是Maven的程序集插件使開發(fā)人員能夠?qū)㈨椖枯敵龊喜⒌絾蝹€可分發(fā)的存檔中,該存檔還包含依賴項、模塊、站點文檔和其他文件。
作用:可以實現(xiàn)自定義打包,從而實現(xiàn)打包項目可以外掛yml配置文件,提供shell運維腳本,大大降低運維成本,比較適用于小規(guī)模的SpringBoot項目(大規(guī)模的項目推薦docker容器部署)
配置說明
引入插件(pom文件中)
<project>...<build><plugins><!--springboot項目打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.7.RELEASE</version><configuration><mainClass>com.alan.SpringBootMain</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><!--maven自定義打包插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.5.0</version><configuration><descriptors><!--具體的配置文件--><descriptor>src/main/assembly/assembly.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><!--綁定到maven操作類型上--><phase>package</phase><!--運行一次--><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>
配置assembly文件(在pom中設(shè)定的位置下創(chuàng)建,我這里是src/main/assembly/assembly.xml)
<assembly><!-- ? ? ? ?必須寫,否則打包時會有 assembly ID must be present and non-empty 錯誤 ? ? ? ?這個名字最終會追加到打包的名字的末尾,如項目的名字為 hangge-test-0.0.1-SNAPSHOT, ? ? ? ?則最終生成的包名為 hangge-test-0.0.1-SNAPSHOT-bin.tar.gz ? ?--><id>bin</id><!-- 打包的類型,如果有N個,將會打N個類型的包 --><formats><format>tar.gz</format><!--<format>zip</format>--></formats><includeBaseDirectory>true</includeBaseDirectory><!--第三方依賴設(shè)置--><dependencySets><dependencySet><!--使用項目中的artifact,第三方包打包進tar.gz文件的lib目錄下--><useProjectArtifact>true</useProjectArtifact><outputDirectory>lib</outputDirectory></dependencySet></dependencySets><!--文件設(shè)置--><fileSets><!-- ? ? ? ? ? ?0755->即用戶具有讀/寫/執(zhí)行權(quán)限,組用戶和其它用戶具有讀寫權(quán)限; ? ? ? ? ? ?0644->即用戶具有讀寫權(quán)限,組用戶和其它用戶具有只讀權(quán)限; ? ? ? ?--><!-- 將src/main/assembly/bin目錄下的所有文件輸出到打包后的bin目錄中 --><fileSet><directory>src/main/assembly/bin</directory><outputDirectory>bin</outputDirectory><fileMode>0755</fileMode><!--如果是腳本,一定要改為unix.如果是在windows上面編碼,會出現(xiàn)dos編寫問題--><lineEnding>unix</lineEnding><filtered>true</filtered><!-- 是否進行屬性替換 --></fileSet><!-- 將src/main/assembly/config目錄下的所有文件輸出到打包后的config目錄中 --><fileSet><directory>src/main/assembly/config</directory><outputDirectory>config</outputDirectory><fileMode>0644</fileMode></fileSet><!-- 將src/main/resources下配置文件打包到config目錄 --><fileSet><directory>src/main/resources</directory><outputDirectory>/config</outputDirectory><includes><include>**/*.xml</include><include>**/*.properties</include><include>**/*.yml</include></includes><filtered>true</filtered><!-- 是否進行屬性替換 --></fileSet><!-- 將項目啟動jar打包到lib目錄中 --><fileSet><directory>target</directory><outputDirectory>lib</outputDirectory><includes><include>*.jar</include></includes></fileSet><!-- 將項目說明文檔打包到docs目錄中 --><fileSet><directory>.</directory><outputDirectory>docs</outputDirectory><includes><include>*.md</include></includes><fileMode>0644</fileMode></fileSet><fileSet><directory>docs</directory><outputDirectory>docs</outputDirectory><fileMode>0644</fileMode></fileSet><fileSet><directory>src/main/assembly/docs</directory><outputDirectory>docs</outputDirectory><fileMode>0644</fileMode></fileSet></fileSets></assembly>
編寫運維shell腳本(在assembly中設(shè)定的位置下創(chuàng)建,我這里是src/main/assembly/bin)
start.sh
!/bin/bash項目名稱SERVER_NAME="${project.artifactId}"# jar名稱JAR_NAME="${project.build.finalName}.jar"# 進入bin目錄cd `dirname $0`bin目錄絕對路徑BIN_DIR=`pwd`返回到上一級項目根目錄路徑cd ..打印項目根目錄絕對路徑`pwd` 執(zhí)行系統(tǒng)命令并獲得結(jié)果DEPLOY_DIR=`pwd`# 外部配置文件絕對目錄,如果是目錄需要/結(jié)尾,也可以直接指定文件如果指定的是目錄,spring則會讀取目錄中的所有配置文件CONF_DIR=$DEPLOY_DIR/configSERVER_PORT=`sed '/server.port/!d;s/.*=//' config/application.properties | tr -d '\r'`獲取應(yīng)用的端口號SERVER_PORT=`sed -nr '/port: [0-9]+/ s/.*port: +([0-9]+).*/\1/p' config/application.yml`PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`if [ "$1" = "status" ]; thenif [ -n "$PIDS" ]; thenecho "The $SERVER_NAME is running...!"echo "PID: $PIDS"exit 0elseecho "The $SERVER_NAME is stopped"exit 0fifiif [ -n "$PIDS" ]; thenecho "ERROR: The $SERVER_NAME already started!"echo "PID: $PIDS"exit 1fiif [ -n "$SERVER_PORT" ]; thenSERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`if [ $SERVER_PORT_COUNT -gt 0 ]; thenecho "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"exit 1fifi# 項目日志輸出絕對路徑LOGS_DIR=$DEPLOY_DIR/logs如果logs文件夾不存在,則創(chuàng)建文件夾if [ ! -d $LOGS_DIR ]; thenmkdir $LOGS_DIRfiSTDOUT_FILE=$LOGS_DIR/catalina.log# JVM ConfigurationJAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "JAVA_DEBUG_OPTS=""if [ "$1" = "debug" ]; thenJAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "fiJAVA_JMX_OPTS=""if [ "$1" = "jmx" ]; thenJAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "fiJAVA_MEM_OPTS=""BITS=`java -version 2>&1 | grep -i 64-bit`if [ -n "$BITS" ]; thenJAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -XX:PermSize=128m -XX:+UseG1GC "elseJAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:+UseParallelGC "fi# 加載外部log4j2文件的配置LOG_IMPL_FILE=log4j2.xmlLOGGING_CONFIG=""if [ -f "$CONF_DIR/$LOG_IMPL_FILE" ]thenLOGGING_CONFIG="-Dlogging.config=$CONF_DIR/$LOG_IMPL_FILE"fiCONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "echo -e "Starting the $SERVER_NAME ..."nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/lib/$JAR_NAME > $STDOUT_FILE 2>&1 &echo "OK!"PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`echo "PID: $PIDS"echo "STDOUT: $STDOUT_FILE"
stop.sh
!/bin/bash項目名稱APPLICATION="${project.artifactId}"項目啟動jar包名稱APPLICATION_JAR="${project.build.finalName}.jar"通過項目名稱查找到PI,然后kill -9 pidPID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')if [[ -z "$PID" ]]thenecho ${APPLICATION} is already stoppedelseecho kill ?${PID}kill -9 ${PID}echo ${APPLICATION} stopped successfullyfi
打包項目
項目下執(zhí)行
mvn clean package
命令進行打包,打包后的壓縮包路徑/project_url/target/test01-1.0-SNAPSHOT-bin.tar.gz;打包后的項目文件如下:

運行項目
解壓文件:
tar -zxvf /project_url/target/test01-1.0-SNAPSHOT-bin.tar.gz
進入bin目錄下:
cd /project_url/target/test01-1.0-SNAPSHOT/bin
運行項目:
sh start.sh
,運行日志在/project_url/target/test01-1.0-SNAPSHOT/logs路徑下關(guān)閉項目:
sh stop.sh
標簽: