springboot創建linux系統下啟動服務


 

      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了

我們查看一下服務

可以看到服務也啟動了

再停止一下服務

可以看到服務成功停止了,並且是停止狀態。我們重啟一下機器,看是不是能能自動啟動

 

可以看到 服務也成功啟動了,所有工作完成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM