SpringBoot在linux系统中以服务形式启动
SpringBoot使得我们可以快速地上手以及开发Spring项目。我们可以把工程打成一个jar包,然后部署到服务器上(这里只讨论Linux,因为没多少人会拿Windows当服务器)。nohup命令可以让程序作为后台进程执行,但是它不好管理维护,也显得很不专业。更好的方法是将SpringBoot作为Service启动。
一、Maven打包
在pom.xml
配置文件中添加
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
其中<executable>true</executable>
一定要加,标示该jar为可执行,否则机器启动SpringBoot服务会报错。
二、配置springboot服务
要将程序注册成服务,必须保证jar有执行(下面例子中的x)的权限,否则服务无法启动。
System V Init服务
System V Init
服务都在目录/etc/init.d/
下面。只需在此目录下创建一个到SpringBoot Jar的链接,就可以注册Service。假设我们的jar的目录为
/usr/local/project/test/myApp.jar
执行命令:
sudo ln -s /usr/local/project/test/myApp.jar /etc/init.d/myApp
这里,必须指定jar的绝对路径。
然后,我们就可以通过如下命令来启动服务了:
sudo service myApp start
[root@localhost test]# ps -ef | grep myApp
root 1945 1 16 12:23 pts/0 00:00:09 /bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /usr/local/project/test/myApp.jar
root 1980 1754 0 12:24 pts/0 00:00:00 grep --color=auto myApp
[root@localhost test]#
同时,服务对应的PID会放在/var/run/myApp/myApp.pid
,而程序运行的日志则放在/var/log/myApp.log
。
Systemd服务
Systemd服务的目录在/etc/systemd/system/
,我们需要在此目录下创建一个名叫myApp.service的文件,并将如下内容写入文件:
[Unit]
Description=My Spring Boot Service
After=syslog.target
[Service]
User=root
ExecStart=/usr/local/project/test/myApp.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
这里要把ExecStart
和Descriptino
以及User
改成自己的,把ExecStart
指定到jar所在的目录,一样,也需要文件的绝对路径。同时别忘了设置myApp.service的执行权限。
服务的启动命令
sudo systemctl start myApp
如果报错:
[root@localhost system]# systemctl start myApp
Warning: myApp.service changed on disk. Run 'systemctl daemon-reload' to reload units.
则执行systemctl daemon-reload
即可
如果User没有权限则会报错:
12月 21 12:36:14 localhost.localdomain systemd[1]: myApp.service: main process exited, code=exited, status=217/USER
12月 21 12:36:14 localhost.localdomain systemd[1]: Unit myApp.service entered failed state.
12月 21 12:36:14 localhost.localdomain systemd[1]: myApp.service failed.
则需要修改myApp.service
配置文件中 Service->User 修改成正确的用户即可
将服务设置为开机启动:
sudo systemctl enable myApp
三、自定义JVM参数
如果是用java -jar的方式启动的java应用,我们可以直接在命令行中指定JVM参数,那以Service形式启动的Java程序,该如何指定JVM参数呢?
一般,我们在用maven编jar包的时候,可以指定JVM参数,比如用如下方式:
mvn clean package -DargLine="-Xmx512m -Xms512m"
但是如果我们希望在服务器上独立额外设置一些参数呢?
其实也很简单,在启动SpringBoot服务之前,会先去jar包所在的同级目录下查找,有没有此jar的同名配置文件。
在这里,我们只需要在 /usr/local/project/test/ 目录下,添加一个叫myApp.conf 的配置文件(名字要和jar的名字相同),在文件里面自定义JVM参数JAVA_OPTS:
export JAVA_OPTS="-Xmx512m -Xms512m"
重启服务:
[root@localhost test]# systemctl restart myApp
[root@localhost test]# ps -ef | grep myApp
root 2487 1 0 12:58 ? 00:00:00 /bin/bash /usr/local/project/test/myApp.jar SuccessExitStatus=143
root 2504 2487 91 12:58 ? 00:00:07 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Xmx512m -Xms512m -jar /usr/local/project/test/myApp.jar SuccessExitStatus=143
root 2536 1754 0 12:58 pts/0 00:00:00 grep --color=auto myApp
[root@localhost test]#
可以看到,Java进程的启动参数上多了-Xmx512m -Xms512m
。
参考:https://nightfield.com.cn/index.php/archives/93/
参考:Deploying Spring Boot Applications