1 概述
SpringBoot使得我們可以快速地上手以及開發Spring項目。我們可以把工程打成一個jar包,然後部署到服務器上(這裏只討論Linux,因爲沒多少人會拿Windows當服務器)。nohup命令可以讓程序作爲後臺進程執行,但是它不好管理維護,也顯得很不專業。更好的方法是將SpringBoot作爲Service啓動。
2 步驟
2.1 Maven打包
通過package命令打jar包:
mvn clean package
這裏注意一點,一定要將org.springframework.boot plugin添加到pom文件裏面,其中“true”一定要加,標示該jar爲可執行,否則機器啓動SpringBoot服務會報錯。plugin如下所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
2.2 配置SpringBoot服務
要將程序註冊成服務,必須保證jar有執行(下面例子中的x)的權限,否則服務無法啓動。
[nightfield@mthf2mulsvr001 ~]$ ls -l
total 10904
-rwx------. 1 nightfield nightfield 11164464 Mar 5 13:01 myApp.jar
有兩種比較主流的方式配置springBoot服務
2.2.1 System V Init服務
System V Init服務都在目錄/etc/init.d/下面。只需在此目錄下創建一個到SpringBoot Jar的鏈接,就可以註冊Service。假設我們的jar的目錄爲/home/nightfield/myApp.jar:
sudo ln -s /home/nightfield/myApp.jar /etc/init.d/myApp
這裏,必須指定jar的絕對路徑。
然後,我們就可以通過如下命令來啓動服務了:
sudo service myApp start
這個服務以那個用戶來運行,取決於jar包所屬的用戶。在該例子中,jar包屬於用戶nightfield,那麼它將以nightfield用戶來運行。
[nightfield@mthf2mulsvr001 ~]$ ps -ef | grep myApp
nightfi+ 19741 1 0 13:44 ? 00:00:00 /bin/bash /home/nightfield/myApp.jar
nightfi+ 19756 19741 99 13:44 ? 00:00:16 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/nightfield/myApp.jar
nightfi+ 19851 7759 0 13:45 pts/0 00:00:00 grep --color=auto myApp
可以看到,應用正以nightfield用戶跑在後臺,其實服務只是以下命令的包裝:
/usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/nightfield/myApp.jar
同時,服務對應的PID會放在/var/run/myApp/myApp.pid,而程序運行的日誌則放在/var/log/your-app.log。
2.2.2 Systemd服務
Systemd服務的目錄在/etc/systemd/system/,我們需要在此目錄下創建一個名叫myApp.service的文件,並將如下內容寫入文件:
[Unit]
Description=My Spring Boot Service
After=syslog.target
[Service]
User=nightfield
ExecStart=/home/nightfield/myApp.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
這裏要把ExecStart和Descriptino改成自己的,把ExecStart指定到jar所在的目錄,一樣,也需要文件的絕對路徑。同時別忘了設置myApp.service的執行權限。
服務啓動命令爲:
sudo systemctl start myApp
將服務設置爲開機啓動:
sudo systemctl enable myApp
Systemd作爲後起之秀,功能更加強大,支持的命令和參數也更多,具體可以參考這裏。
3 自定義JVM參數
如果是用java -jar的方式啓動的java應用,我們可以直接在命令行中指定JVM參數,那以Service形式啓動的Java程序,該如何指定JVM參數呢?
一般,我們在用maven編jar包的時候,可以指定JVM參數,比如用如下方式:
mvn clean package -DargLine="-Xmx1024m"
但是如果我們希望在服務器上獨立額外設置一些參數呢?
其實也很簡單,在啓動SpringBoot服務之前,會先去jar包所在的同級目錄下查找,有沒有此jar的同名配置文件。在這裏,我們只需要在/home/nightfield/目錄下,添加一個叫myApp.conf的配置文件(名字要和jar的名字相同),在文件裏面自定義JVM參數JAVA_OPTS:
[nightfield@mthf2mulsvr001 ~]$ pwd
/home/nightfield
[nightfield@mthf2mulsvr001 ~]$ ls -l
total 27532
-rwx------. 1 nightfield nightfield 39 Mar 5 14:10 myApp.conf
-rwx------. 1 nightfield nightfield 28186505 Mar 5 13:12 myApp.jar
[nightfield@mthf2mulsvr001 ~]$ cat myApp.conf
export JAVA_OPTS="-Xmx4096m -Xms4096m"
[nightfield@mthf2mulsvr001 ~]$
添加配置文件之後,重啓服務,再次查看服務進程:
[nightfield@mthf2mulsvr001 bin]$ ps -ef | grep myApp
nightfi+ 11343 1 0 14:13 ? 00:00:00 /bin/bash /homt/nightfield/myApp.jar
nightfi+ 11358 11343 48 14:13 ? 00:00:38 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Xmx4096m -Xms4096m -jar /homt/nightfield/myApp.jar
nightfi+ 11908 11884 0 14:14 pts/0 00:00:00 grep --color=auto myApp
可以看到,Java進程的啓動參數上多了“-Xmx4096m -Xms4096m”。
4 總結
本文介紹了將SpringBoot在Linux下作爲服務啓動的兩種方式,同時介紹了自定義JVM啓動參數的方法。
5 參考
Spring Boot Application as a Service
Deploying Spring Boot Applications