springboot 幫我解決了不少配置性的問題。但是同時候也帶來了一些部署上的問題。我相信,一個真正的線上項目,絕不可能是java -jar xx.jar 去直接啟動,對應不同操作系統有不同的服務在才,能主動啟動與停止。能隨機啟動,這是基本的要求,當然平時可能都是運維大哥幫我們寫了一些腳本完成這項目任務,今天我想自己動手寫寫,項目中自帶了腳本,能為部署省去不少麻煩,話不多說,上代碼。
第一步
我們先建立一人簡單的spring項目,簡單寫了一個hello請求,並返回hello+傳進來的參數,
第二步
我們對項目做一些配置。比如要把外部配置文件從jar 包分離出來,方便配置修改,把第三jar 打進lib包,然后再把這些壓縮成xx.tar.gz 這里不贅述,直接上貼配置
<build> <finalName>${finalname}</finalName> <resources> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}</targetPath> <includes> <include>**/cer/**</include> <include>**/logback*.xml</include> <include>**/*.yml</include> <include>**/*.sh</include> <include>**/readme</include> </includes> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <useDefaultDelimiters>true</useDefaultDelimiters> </configuration> <dependencies> <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-filtering</artifactId> <version>3.1.1</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>${mainclass}</mainClass> </manifest> <manifestEntries> <Class-Path>./</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2.1</version> <configuration> <descriptors> <descriptor>src/main/resources/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
這樣運行mvn clean compile package 我們就可以得到一個 demo-bin.tar.gz 初步完成了。
第三步
這也是本篇文章的主要部分,demo-bin.tar.gz 解壓后 如下
我們使用常規啟動
java -jar demo.jar
可以看到項目已正常啟動並可以訪問了
但是這樣控制台一關就沒了,或者加上& 后台啟動,但是要重啟或是開機啟動又麻煩了。於是就寫了以下腳本
demo_init.sh
#!/bin/sh apppath=$(cd `dirname $0`;pwd) sed -i "s?apppath=.?apppath=$apppath?" ./${finalname}.sh sed -i "s?JAVA_HOME=.?JAVA_HOME=$JAVA_HOME?" ./${finalname}.sh sed -i "s?<property name=\"filepath\" value=\"./\"/>?<property name=\"filepath\" value=\"$apppath/\"/>?" ./logback.xml cp ./${finalname}.sh /etc/init.d/${finalname} systemctl enable ${finalname} service ${finalname} start
這段代碼這里有必要解釋一下
第一行固定寫法 不解釋,第二行獲取jar包所在目錄,第三到第五行 是對直正要生成的腳本做一些變量替換。還是日志文件的路徑的替換。不理解的同學可以自行百度sed 用法
后面三行 替換后變理的腳本文件放到init.d 目錄下
開啟自啟動,然后啟動服務
demo.sh
#!/bin/sh # chkconfig: 2345 10 90 # description: ${finalname} JAVA_HOME=. PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH appname=${finalname} apppath=./ . /etc/init.d/functions case "$1" in start) echo $JAVA_HOME $JAVA_HOME/bin/java -Xms2048m -Xmx2048m -jar /home/soft/demo/demo.jar & echo $! > /var/run/$appname.pid ;; stop) if [ ! -f /var/run/$appname.pid ]; then echo "$appname: not running" exit 1 fi kill -TERM `cat /var/run/$appname.pid` ;; reload) if [ ! -f /var/run/$appname.pid ]; then echo "$appname: not running" exit 1 fi ;; *) echo "Usage: /etc/init.d/$appname {start|stop|reload}" exit 1 ;; esac exit 0
常規的腳本,主要注意標線兩個地方
第四步
驗證我們的腳本
執行init腳本
可以看服務啟動OK了
我們查看一下服務
可以看到服務也啟動了
再停止一下服務
可以看到服務成功停止了,並且是停止狀態。我們重啟一下機器,看是不是能能自動啟動
可以看到 服務也成功啟動了,所有工作完成。