1 概述
SpringBoot使得咱們能夠快速地上手以及開發Spring項目。咱們能夠把工程打成一個jar包,而後部署到服務器上(這裏只討論Linux,由於沒多少人會拿Windows當服務器)。nohup命令可讓程序做爲後臺進程執行,可是它很差管理維護,也顯得很不專業。更好的方法是將SpringBoot做爲Service啓動。html
2 步驟
2.1 Maven打包
經過package命令打jar包:java
mvn clean package
這裏注意一點,必定要將org.springframework.boot plugin添加到pom文件裏面,其中「<executable>true</executable>」必定要加,標示該jar爲可執行,不然機器啓動SpringBoot服務會報錯。plugin以下所示:spring
<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)的權限,不然服務沒法啓動。shell
[nightfield@mthf2mulsvr001 ~]$ ls -l total 10904 -rwx------. 1 nightfield nightfield 11164464 Mar 5 13:01 myApp.jar
有兩種比較主流的方式配置springBoot服務bash
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的絕對路徑。 而後,咱們就能夠經過以下命令來啓動服務了:app
sudo service myApp start
這個服務以那個用戶來運行,取決於jar包所屬的用戶。在該例子中,jar包屬於用戶nightfield,那麼它將以nightfield用戶來運行。maven
[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用戶跑在後臺,其實服務只是如下命令的包裝:spring-boot
/usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/nightfield/myApp.jar
同時,服務對應的PID會放在/var/run/myApp/myApp.pid,而程序運行的日誌則放在/var/log/myApp.log。ui
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