SpringBoot中使用Maven插件自定義項(xiàng)目結(jié)構(gòu)進(jìn)行部署

1. 前言

本篇博客記錄在工作中的學(xué)習(xí)心得秋麸!在SpringBoot項(xiàng)目中世落,一般使用默認(rèn)的配置將項(xiàng)目打包成一個(gè)內(nèi)嵌Tomcat的jar狭瞎,在服務(wù)端之間java -jar 項(xiàng)目名.jar匆背,這樣就可以啟動(dòng)了鸣奔。但是典尾,當(dāng)每修改一點(diǎn)點(diǎn)東西都要替換掉整個(gè)jar役拴,而且后臺(tái)運(yùn)行jar的方式也比較復(fù)雜。本文只針對(duì)在使用SpringBoot做單體應(yīng)用钾埂,而不是分布式部署河闰,具體分布式是否適合還待研究科平。
所以接下來的重點(diǎn)來了:拆分部署:所有的jar放到lib文件夾下,resource下目錄保持不變姜性,也就是資源文件與jar分離

  • 讓項(xiàng)目本身打包成單獨(dú)jar瞪慧,使之與其他依賴獨(dú)立開來
  • 使資源文件與源代碼jar分離,當(dāng)我修改mapper對(duì)應(yīng)的xml時(shí)部念,只需要更新對(duì)應(yīng)的xml弃酌,其他資源文件也是類似
  • 在啟動(dòng)方面是有腳本去啟動(dòng)與暫停服務(wù)

2. Maven插件介紹

2.1 主要使用到的maven依賴:
  • maven-compiler-plugin: 指定Maven編譯時(shí)的設(shè)置
  • maven-source-plugin: 生成源代碼包
  • maven-assembly-plugin: 構(gòu)建可執(zhí)行jar(包括項(xiàng)目依賴的jar)
  • maven-jar-plugin: 配置本項(xiàng)目jar信息
2.2 Maven插件一一介紹

maven-compiler-plugin:指定Maven編譯時(shí)的設(shè)置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <encoding>${project.build.sourceEncoding}</encoding>
        <compilerArgs>
            <arg>-Xlint:deprecation</arg>
            <arg>-Xlint:unchecked</arg>
        </compilerArgs>
    </configuration>
</plugin>
標(biāo)簽 具體釋義
<source> 源代碼使用的JDK版本
<target> 生成的目標(biāo)class文件的編譯版本
<encoding> 字符集編碼
<meminitial> 編譯器使用的初始內(nèi)存
<maxmem> 編譯器使用的最大內(nèi)存
<compilerArgs> 設(shè)置Java編譯器的執(zhí)行參數(shù)
<arg>-Xlint:deprecation</arg> 忽略代碼中已過時(shí)API警告
<arg>-Xlint:unchecked</arg> 忽略代碼中未經(jīng)檢查或不安全的操作

maven-source-plugin: 生成源代碼包

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <configuration>
        <attach>true</attach>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>
標(biāo)簽 具體釋義
<executions> 配置執(zhí)行的參數(shù)
<phase> 綁定到package生命周期階段上
<goal> 生成jar包

maven-jar-plugin: 配置本項(xiàng)目jar信息

plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>cn.jtcoding.packagedemo.SpringbootPackageDemoApplication</mainClass>
                <classpathPrefix>../lib/</classpathPrefix>
                <addClasspath>false</addClasspath>
            </manifest>
        </archive>
        <excludes>
            <exclude>*.java</exclude>
        </excludes>
    </configuration>
</plugin>
標(biāo)簽 具體釋義
<mainClass> 指定本項(xiàng)目jar的main-class
<classpathPrefix> 指定依賴的jar以及本項(xiàng)目jar所在的路徑
<addClasspath> 添加外部jar的classpath項(xiàng)

maven-assembly-plugin: 構(gòu)建可執(zhí)行jar(包括項(xiàng)目依賴的jar)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>src/main/resources/assembly.xml</descriptor>
        </descriptors>
        <outputDirectory>${project.build.directory}/application</outputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>assembly_setting</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
標(biāo)簽 具體釋義
<descriptors> 指定打包的配置文件
<outputDirectory> 指定生成包依賴目錄,該目錄是相對(duì)于根目錄
<executions> 配置執(zhí)行的參數(shù)
<id>assembly_setting</id> 唯一標(biāo)識(shí)儡炼,這里要與assembly.xml文件中id一致
<phase>package</phase> 綁定到package生命周期階段上
<goal>single</goal> 打包只執(zhí)行一次

assembly.xml配置

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <!--添加到生成文件名稱的后綴符-->
    <id>dist_app</id>

    <!--
        打包格式妓湘,支持多種:dir、zip乌询、tar.gz.....
    -->
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <!--
        配置資源文件輸出目錄以及需要過濾的文件夾或文件
    -->
    <fileSets>
        <!--輸出resource下所有資源文件-->
        <fileSet>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>assembly.xml</exclude>
                <exclude>db/**</exclude>
            </excludes>
            <outputDirectory>/</outputDirectory>
        </fileSet>

        <!--輸出bin文件夾-->
        <fileSet>
            <directory>${project.basedir}/bin</directory>
            <outputDirectory>/bin</outputDirectory>
            <fileMode>0775</fileMode>
            <includes>
                <include>*.sh</include>
            </includes>
        </fileSet>
    </fileSets>

    <!--
        配置默認(rèn)所有的jar輸出目錄(依賴jar + 項(xiàng)目jar)
    -->
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>
  • assembly.xml配置都在代碼中加以注釋榜贴,就不做過多介紹
  • 到目前為止,項(xiàng)目的maven插件配置完了妹田,接下來介紹啟動(dòng)與停止服務(wù)的腳本

3. 啟動(dòng)與停止服務(wù)的腳本

3.1 啟動(dòng)腳本:start.sh
#!/bin/bash
# 配置JDK安裝路徑
JAVA_HOME="/usr/local/java/jdk1.8.0_131"
JAVA_CMD=${JAVA_HOME}/bin/java
# JVM的相關(guān)配置
JAVA_OPTION="-Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -server -Xms128M -Xmx256M"
COLOR_RED="\\033[1;31m"
COLOR_GREEN="\\033[1;32m"
COLOR_DEFAULT="\\033[0m"

DT_NOW=`date '+%Y%m%d_%H%M%S'`

# 獲取當(dāng)前文件的路徑
PATH_DIR=$(dirname $(which $0))
# 項(xiàng)目路徑 
APP_HOME=${PATH_DIR%/*}
# jar所在路徑
APP_LIB="${APP_HOME}/lib"

# 變量并執(zhí)行所有jar
for libfile in ${APP_LIB}/*.zip ; do
   if [[ -f ${libfile} ]] ; then
       CLASSPATH=${libfile}:${CLASSPATH}
   fi
done
for libfile in ${APP_LIB}/*.jar ; do
   if [[ -f ${libfile} ]] ; then
       CLASSPATH=${libfile}:${CLASSPATH}
   fi
done
CLASSPATH=${APP_HOME}:${CLASSPATH}

# 記錄日志
cd ${APP_HOME}
if [[ ! -d "log/" ]]; then
   mkdir log
fi
# 配置啟動(dòng)類
CMD="${JAVA_CMD} ${JAVA_OPTION} -classpath ${CLASSPATH}\ cn.jtcoding.packagedemo.SpringbootPackageDemoApplication"
`${CMD} >${APP_HOME}/log/stderr.txt 2>&1 &`

sleep 3
ps -eaf | grep "java" | grep "${APP_HOME}/"
3.2 停止腳本:stop.sh
#!/bin/bash
PATH_DIR=$(dirname $(which $0))
PROCESS_NAME=${PATH_DIR%/*}
kill -9 $(ps -eaf|grep -i "java .*-classpath .*${PROCESS_NAME}/"|grep -v 'grep'|awk '{print $2}')
3.3 至此項(xiàng)目就配置完成唬党,其中有以下細(xì)節(jié)需要留意:
  • 所有的jar都輸出在lib文件夾下,assembly.xml文件不需要鬼佣,所有過濾掉驶拱,其他資源正常輸出不變化
  • 現(xiàn)在的打包方式是tar.gz,因?yàn)楹竺媸侵苯由蟼鞯絣inux上進(jìn)行部署測(cè)試晶衷,所有打包成tar.gz蓝纲,在實(shí)際開發(fā)會(huì)打包成dir,這樣生成的就是文件以及文件夾房铭,那么在修改資源文件直接將資源文件上傳即可驻龟,修改代碼直接將lib下的本項(xiàng)目jar替換掉即可
  • 在start.sh中温眉,請(qǐng)修改 JAVA_HOME啟動(dòng)類
  • 在Windows機(jī)子上缸匪,shell腳本格式會(huì)被編譯dos,在linux上需要更改类溢,后面會(huì)介紹
  • maven-assembly-plugin的配置方式有兩種:
    1. 現(xiàn)在的我是配置了<executions>信息凌蔬,
      執(zhí)行:mvn clean package -Dmaven.test.skip=true
    2. 如果沒有配置<executions>信息,在命令中指定即可
      執(zhí)行:mvn clean package assembly:single -Dmaven.test.skip=true

4. 實(shí)踐

所有步驟已經(jīng)完成闯冷,接下來打包部署實(shí)踐環(huán)節(jié)

4.1 現(xiàn)項(xiàng)目結(jié)構(gòu):
項(xiàng)目結(jié)構(gòu)
4.2 打包:
打包
4.3 打包完成:
打包完成
4.4 上傳到Linux服務(wù)砂心,這里使用的是CentOS
上傳到Linux服務(wù)

上傳成功
4.5 解壓
解壓命令

解壓完成

項(xiàng)目目錄
4.6 執(zhí)行啟動(dòng)腳本
報(bào)錯(cuò)了

在啟動(dòng)的時(shí)候報(bào)錯(cuò)了,原因是我本地是Windows系統(tǒng)蛇耀,shell文件別編譯測(cè)dos命令腳本格式了辩诞,使用vim修改即可:

vim修改
4.7 執(zhí)行set ff查看腳本文件格式
set ff

format=dos
4.8 更改文件格式:set ff=unix,保存退出
set ff=unix
4.9 停止文件同上更改

.....

4.10 啟動(dòng)
啟動(dòng)
4.11 防火墻開放端口
firewall-cmd --zone=public --add-port=10027/tcp --permanent
firewall-cmd --reload
4.12 訪問http://www.jtcoding.cn:10027/tests
訪問

5. 總結(jié)

  • 更多注釋盡在源碼
  • 主要是對(duì)maven的相關(guān)插件以及啟動(dòng)停止腳本學(xué)習(xí)
  • 這樣部署對(duì)于單體項(xiàng)目方便了管理(個(gè)人感覺)
  • 以上是個(gè)人的學(xué)習(xí)記錄纺涤,若有不對(duì)之處译暂,請(qǐng)指出抠忘,謝謝閱讀!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末外永,一起剝皮案震驚了整個(gè)濱河市崎脉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伯顶,老刑警劉巖囚灼,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祭衩,居然都是意外死亡灶体,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門掐暮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赃春,“玉大人,你說我怎么就攤上這事劫乱≈校” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵衷戈,是天一觀的道長狭吼。 經(jīng)常有香客問我,道長殖妇,這世上最難降的妖魔是什么刁笙? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谦趣,結(jié)果婚禮上疲吸,老公的妹妹穿的比我還像新娘。我一直安慰自己前鹅,他們只是感情好摘悴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舰绘,像睡著了一般蹂喻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捂寿,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天口四,我揣著相機(jī)與錄音,去河邊找鬼秦陋。 笑死蔓彩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赤嚼,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼大磺,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了探膊?” 一聲冷哼從身側(cè)響起杠愧,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逞壁,沒想到半個(gè)月后流济,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腌闯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年绳瘟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姿骏。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糖声,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出分瘦,到底是詐尸還是另有隱情蘸泻,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布嘲玫,位于F島的核電站悦施,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏去团。R本人自食惡果不足惜抡诞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望土陪。 院中可真熱鬧昼汗,春花似錦、人聲如沸鬼雀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽取刃。三九已至蹋肮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間璧疗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工馁龟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崩侠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓坷檩,卻偏偏與公主長得像却音,于是被迫代替她去往敵國和親改抡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354