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的配置方式有兩種:
- 現(xiàn)在的我是配置了<executions>信息凌蔬,
執(zhí)行:mvn clean package -Dmaven.test.skip=true - 如果沒有配置<executions>信息,在命令中指定即可
執(zhí)行:mvn clean package assembly:single -Dmaven.test.skip=true
- 現(xiàn)在的我是配置了<executions>信息凌蔬,
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)指出抠忘,謝謝閱讀!