此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

除了直接使用 运行 Spring Boot 应用程序外,还可以将它们作为 或 Windows 服务运行。java -jarsystemdinit.dSpring中文文档

作为 systemd 服务安装

systemd是 System V init 系统的继任者,现在被许多现代 Linux 发行版使用。 可以使用“服务”脚本启动Spring Boot应用程序。systemdSpring中文文档

假设您有一个打包为 uber jar 的 Spring Boot 应用程序,要将其作为服务安装,请创建一个名为 并将其放在目录中的脚本。 以下脚本提供了一个示例:/var/myappsystemdmyapp.service/etc/systemd/systemSpring中文文档

[Unit]
Description=myapp
After=syslog.target network.target

[Service]
User=myapp
Group=myapp

Environment="JAVA_HOME=/path/to/java/home"

ExecStart=${JAVA_HOME}/bin/java -jar /var/myapp/myapp.jar
ExecStop=/bin/kill -15 $MAINPID
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
请记住更改应用程序的 、 、 和 字段。DescriptionUserGroupEnvironmentExecStart
该字段未声明脚本操作命令,这意味着默认使用该命令。ExecStartrun

运行应用程序的用户、PID 文件和控制台日志文件由其自身管理,因此必须使用“服务”脚本中的相应字段进行配置。 有关更多详细信息,请参阅服务单元配置手册页systemdSpring中文文档

若要将应用程序标记为在系统启动时自动启动,请使用以下命令:Spring中文文档

$ systemctl enable myapp.service

运行以获取更多详细信息。man systemctlSpring中文文档

请记住更改应用程序的 、 、 和 字段。DescriptionUserGroupEnvironmentExecStart
该字段未声明脚本操作命令,这意味着默认使用该命令。ExecStartrun

作为 init.d 服务安装 (System V)

要将应用程序用作服务,请将其构建配置为生成完全可执行的 jarinit.dSpring中文文档

完全可执行的 jar 通过在文件前面嵌入一个额外的脚本来工作。 目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。 例如,可能默默地无法提取已完全可执行的 jar 或 war。 建议您仅在打算直接执行 jar 或 war 时才使其完全可执行,而不是与 servlet 容器一起运行或部署到 servlet 容器。jar -xfjava -jar
zip64 格式的 jar 文件不能完全可执行。 尝试这样做将导致 jar 文件在直接执行或使用 . 包含一个或多个 zip64 格式嵌套 jar 的标准格式 jar 文件可以完全可执行。java -jar

要使用 Maven 创建“完全可执行”jar,请使用以下插件配置:Spring中文文档

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<executable>true</executable>
	</configuration>
</plugin>

以下示例显示了等效的 Gradle 配置:Spring中文文档

tasks.named('bootJar') {
	launchScript()
}

然后可以符号链接到它以支持标准、、、和命令。init.dstartstoprestartstatusSpring中文文档

添加到完全可执行 jar 中的默认启动脚本支持大多数 Linux 发行版,并在 CentOS 和 Ubuntu 上进行了测试。 其他平台,如 OS X 和 FreeBSD,需要使用自定义脚本。 默认脚本支持以下功能:Spring中文文档

假设您安装了 Spring Boot 应用程序,要将 Spring Boot 应用程序安装为服务,请创建一个符号链接,如下所示:/var/myappinit.dSpring中文文档

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

安装后,您可以按照常规方式启动和停止服务。 例如,在基于 Debian 的系统上,您可以使用以下命令启动它:Spring中文文档

$ service myapp start
如果应用程序无法启动,请检查写入的日志文件是否存在错误。/var/log/<appname>.log

还可以使用标准操作系统工具将应用程序标记为自动启动。 例如,在 Debian 上,您可以使用以下命令:Spring中文文档

$ update-rc.d myapp defaults <priority>

保护 init.d 服务

以下是有关如何保护作为 init.d 服务运行的 Spring Boot 应用程序的一组准则。 它并不是一个详尽的列表,列出了为强化应用程序及其运行环境而应执行的所有操作。

当以 root 身份执行时,就像使用 root 启动 init.d 服务一样,默认可执行脚本以环境变量中指定的用户身份运行应用程序。 如果未设置环境变量,则改用拥有 jar 文件的用户。 您永远不应该以 ,所以永远不应该是 root,并且您的应用程序的 jar 文件永远不应该归 root 所有。 相反,请创建一个特定的用户来运行您的应用程序,并设置环境变量或用于使其成为 jar 文件的所有者,如以下示例所示:RUN_AS_USERrootRUN_AS_USERRUN_AS_USERchownSpring中文文档

$ chown bootapp:bootapp your-app.jar

在这种情况下,默认可执行脚本以用户身份运行应用程序。bootappSpring中文文档

为了减少应用程序的用户帐户被泄露的机会,您应该考虑阻止它使用登录 shell。 例如,您可以将帐户的 shell 设置为 。/usr/sbin/nologin

您还应该采取措施防止修改应用程序的 jar 文件。 首先,配置其权限,使其无法写入,只能由其所有者读取或执行,如以下示例所示:Spring中文文档

$ chmod 500 your-app.jar

其次,如果您的应用程序或运行它的帐户遭到入侵,您还应该采取措施限制损害。 如果攻击者确实获得了访问权限,他们可以使 jar 文件可写并更改其内容。 防止这种情况的一种方法是使用 使其不可变,如以下示例所示:chattrSpring中文文档

$ sudo chattr +i your-app.jar

这将阻止任何用户(包括 root)修改 jar。Spring中文文档

如果使用 root 来控制应用程序的服务,并且您使用 .conf 文件来自定义其启动,则该文件将由 root 用户读取和评估。 应相应地保护它。 使用使文件只能由所有者读取,并用于使root成为所有者,如以下示例所示:.confchmodchownSpring中文文档

$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf

自定义启动脚本

Maven 或 Gradle 插件编写的默认嵌入式启动脚本可以通过多种方式进行自定义。 对于大多数人来说,使用默认脚本和一些自定义通常就足够了。 如果您发现无法自定义所需的内容,请使用该选项完全编写自己的文件。embeddedLaunchScriptSpring中文文档

在编写启动脚本时对其进行自定义

当开始脚本写入 jar 文件时,自定义启动脚本的元素通常是有意义的。 例如,init.d 脚本可以提供“描述”。 由于您预先知道描述(并且不需要更改),因此您不妨在生成 jar 时提供它。Spring中文文档

要自定义写入元素,请使用 Spring Boot Maven 插件的选项或 Spring Boot Gradle 插件的 launchScript 的 properties 属性embeddedLaunchScriptPropertiesSpring中文文档

默认脚本支持以下属性替换:Spring中文文档

名字 描述 Gradle 默认值 Maven 默认值

modeSpring中文文档

脚本模式。Spring中文文档

autoSpring中文文档

autoSpring中文文档

initInfoProvidesSpring中文文档

“INIT INFO”部分ProvidesSpring中文文档

${task.baseName}Spring中文文档

${project.artifactId}Spring中文文档

initInfoRequiredStartSpring中文文档

Required-Start“INIT INFO”部分。Spring中文文档

$remote_fs $syslog $networkSpring中文文档

$remote_fs $syslog $networkSpring中文文档

initInfoRequiredStopSpring中文文档

Required-Stop“INIT INFO”部分。Spring中文文档

$remote_fs $syslog $networkSpring中文文档

$remote_fs $syslog $networkSpring中文文档

initInfoDefaultStartSpring中文文档

Default-Start“INIT INFO”部分。Spring中文文档

2 3 4 5Spring中文文档

2 3 4 5Spring中文文档

initInfoDefaultStopSpring中文文档

Default-Stop“INIT INFO”部分。Spring中文文档

0 1 6Spring中文文档

0 1 6Spring中文文档

initInfoShortDescriptionSpring中文文档

Short-Description“INIT INFO”部分。Spring中文文档

单行版本(回退到${project.description}${task.baseName})Spring中文文档

${project.name}Spring中文文档

initInfoDescriptionSpring中文文档

Description“INIT INFO”部分。Spring中文文档

${project.description}(回退到${task.baseName})Spring中文文档

${project.description}(回退到${project.name})Spring中文文档

initInfoChkconfigSpring中文文档

chkconfig“INIT INFO”部分Spring中文文档

2345 99 01Spring中文文档

2345 99 01Spring中文文档

confFolderSpring中文文档

的默认值CONF_FOLDERSpring中文文档

包含 jar 的文件夹Spring中文文档

包含 jar 的文件夹Spring中文文档

inlinedConfScriptSpring中文文档

引用应在默认启动脚本中内联的文件脚本。 这可用于设置环境变量,例如在加载任何外部配置文件之前JAVA_OPTSSpring中文文档

logFolderSpring中文文档

的默认值。 仅对服务有效LOG_FOLDERinit.dSpring中文文档

logFilenameSpring中文文档

的默认值。 仅对服务有效LOG_FILENAMEinit.dSpring中文文档

pidFolderSpring中文文档

的默认值。 仅对服务有效PID_FOLDERinit.dSpring中文文档

pidFilenameSpring中文文档

中 PID 文件名称的默认值。 仅对服务有效PID_FOLDERinit.dSpring中文文档

useStartStopDaemonSpring中文文档

是否应使用该命令(如果可用)来控制进程start-stop-daemonSpring中文文档

trueSpring中文文档

trueSpring中文文档

stopWaitTimeSpring中文文档

默认值(以秒为单位)。 仅对服务有效STOP_WAIT_TIMEinit.dSpring中文文档

60Spring中文文档

60Spring中文文档

在脚本运行时自定义脚本

对于在编写 jar 需要自定义的脚本项,您可以使用环境变量或配置文件Spring中文文档

默认脚本支持以下环境属性:Spring中文文档

变量 描述

MODESpring中文文档

操作的“模式”。 默认值取决于 jar 的构建方式,但通常是(这意味着它试图通过检查它是否是名为 的目录中的符号链接来猜测它是否是 init 脚本)。 您可以将其显式设置为以便命令正常工作,或者如果要在前台运行脚本,则将其设置为。autoinit.dservicestop|start|status|restartrunSpring中文文档

RUN_AS_USERSpring中文文档

将用于运行应用程序的用户。 如果未设置,则将使用拥有 jar 文件的用户。Spring中文文档

USE_START_STOP_DAEMONSpring中文文档

该命令(如果可用)是否应用于控制进程。 默认值为 。start-stop-daemontrueSpring中文文档

PID_FOLDERSpring中文文档

pid 文件夹的根名称(默认为 )。/var/runSpring中文文档

LOG_FOLDERSpring中文文档

要放入日志文件的文件夹的名称(默认情况下为 )。/var/logSpring中文文档

CONF_FOLDERSpring中文文档

要从中读取 .conf 文件的文件夹的名称(默认情况下与 jar-file 的文件夹相同)。Spring中文文档

LOG_FILENAMESpring中文文档

(默认情况下为 )中日志文件的名称。LOG_FOLDER<appname>.logSpring中文文档

APP_NAMESpring中文文档

应用的名称。 如果 jar 是从符号链接运行的,则脚本会猜测应用名称。 如果它不是符号链接,或者您想要显式设置应用程序名称,这可能很有用。Spring中文文档

RUN_ARGSSpring中文文档

要传递给程序(Spring Boot 应用)的参数。Spring中文文档

JAVA_HOMESpring中文文档

默认情况下,可执行文件的位置是使用 来发现的,但如果 中有可执行文件,则可以显式设置它。javaPATH$JAVA_HOME/bin/javaSpring中文文档

JAVA_OPTSSpring中文文档

在 JVM 启动时传递给 JVM 的选项。Spring中文文档

JARFILESpring中文文档

jar 文件的显式位置,以防脚本用于启动实际上未嵌入的 jar。Spring中文文档

DEBUGSpring中文文档

如果不为空,则在 shell 进程上设置标志,允许您查看脚本中的逻辑。-xSpring中文文档

STOP_WAIT_TIMESpring中文文档

在强制关闭之前停止应用程序时等待的时间(以秒为单位)(默认情况下)。60Spring中文文档

、 和 变量仅对服务有效。 对于 ,等效的自定义是使用“service”脚本进行的。 有关更多详细信息,请参见服务单元配置手册页PID_FOLDERLOG_FOLDERLOG_FILENAMEinit.dsystemd
使用 Conf 文件

除了 和 之外,可以使用文件配置上一节中列出的设置。 该文件应位于 jar 文件旁边,并且具有相同的名称,但后缀为 而不是 。 例如,名为 的 jar 使用名为 的配置文件,如以下示例所示:JARFILEAPP_NAME.conf.conf.jar/var/myapp/myapp.jar/var/myapp/myapp.confSpring中文文档

myapp.conf
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
如果您不喜欢将配置文件放在 jar 文件旁边,您可以设置一个环境变量来自定义配置文件的位置。CONF_FOLDER

若要了解如何适当地保护此文件,请参阅保护 init.d 服务的准则Spring中文文档

完全可执行的 jar 通过在文件前面嵌入一个额外的脚本来工作。 目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。 例如,可能默默地无法提取已完全可执行的 jar 或 war。 建议您仅在打算直接执行 jar 或 war 时才使其完全可执行,而不是与 servlet 容器一起运行或部署到 servlet 容器。jar -xfjava -jar
zip64 格式的 jar 文件不能完全可执行。 尝试这样做将导致 jar 文件在直接执行或使用 . 包含一个或多个 zip64 格式嵌套 jar 的标准格式 jar 文件可以完全可执行。java -jar
如果应用程序无法启动,请检查写入的日志文件是否存在错误。/var/log/<appname>.log
以下是有关如何保护作为 init.d 服务运行的 Spring Boot 应用程序的一组准则。 它并不是一个详尽的列表,列出了为强化应用程序及其运行环境而应执行的所有操作。
为了减少应用程序的用户帐户被泄露的机会,您应该考虑阻止它使用登录 shell。 例如,您可以将帐户的 shell 设置为 。/usr/sbin/nologin
名字 描述 Gradle 默认值 Maven 默认值

modeSpring中文文档

脚本模式。Spring中文文档

autoSpring中文文档

autoSpring中文文档

initInfoProvidesSpring中文文档

“INIT INFO”部分ProvidesSpring中文文档

${task.baseName}Spring中文文档

${project.artifactId}Spring中文文档

initInfoRequiredStartSpring中文文档

Required-Start“INIT INFO”部分。Spring中文文档

$remote_fs $syslog $networkSpring中文文档

$remote_fs $syslog $networkSpring中文文档

initInfoRequiredStopSpring中文文档

Required-Stop“INIT INFO”部分。Spring中文文档

$remote_fs $syslog $networkSpring中文文档

$remote_fs $syslog $networkSpring中文文档

initInfoDefaultStartSpring中文文档

Default-Start“INIT INFO”部分。Spring中文文档

2 3 4 5Spring中文文档

2 3 4 5Spring中文文档

initInfoDefaultStopSpring中文文档

Default-Stop“INIT INFO”部分。Spring中文文档

0 1 6Spring中文文档

0 1 6Spring中文文档

initInfoShortDescriptionSpring中文文档

Short-Description“INIT INFO”部分。Spring中文文档

单行版本(回退到${project.description}${task.baseName})Spring中文文档

${project.name}Spring中文文档

initInfoDescriptionSpring中文文档

Description“INIT INFO”部分。Spring中文文档

${project.description}(回退到${task.baseName})Spring中文文档

${project.description}(回退到${project.name})Spring中文文档

initInfoChkconfigSpring中文文档

chkconfig“INIT INFO”部分Spring中文文档

2345 99 01Spring中文文档

2345 99 01Spring中文文档

confFolderSpring中文文档

的默认值CONF_FOLDERSpring中文文档

包含 jar 的文件夹Spring中文文档

包含 jar 的文件夹Spring中文文档

inlinedConfScriptSpring中文文档

引用应在默认启动脚本中内联的文件脚本。 这可用于设置环境变量,例如在加载任何外部配置文件之前JAVA_OPTSSpring中文文档

logFolderSpring中文文档

的默认值。 仅对服务有效LOG_FOLDERinit.dSpring中文文档

logFilenameSpring中文文档

的默认值。 仅对服务有效LOG_FILENAMEinit.dSpring中文文档

pidFolderSpring中文文档

的默认值。 仅对服务有效PID_FOLDERinit.dSpring中文文档

pidFilenameSpring中文文档

中 PID 文件名称的默认值。 仅对服务有效PID_FOLDERinit.dSpring中文文档

useStartStopDaemonSpring中文文档

是否应使用该命令(如果可用)来控制进程start-stop-daemonSpring中文文档

trueSpring中文文档

trueSpring中文文档

stopWaitTimeSpring中文文档

默认值(以秒为单位)。 仅对服务有效STOP_WAIT_TIMEinit.dSpring中文文档

60Spring中文文档

60Spring中文文档

变量 描述

MODESpring中文文档

操作的“模式”。 默认值取决于 jar 的构建方式,但通常是(这意味着它试图通过检查它是否是名为 的目录中的符号链接来猜测它是否是 init 脚本)。 您可以将其显式设置为以便命令正常工作,或者如果要在前台运行脚本,则将其设置为。autoinit.dservicestop|start|status|restartrunSpring中文文档

RUN_AS_USERSpring中文文档

将用于运行应用程序的用户。 如果未设置,则将使用拥有 jar 文件的用户。Spring中文文档

USE_START_STOP_DAEMONSpring中文文档

该命令(如果可用)是否应用于控制进程。 默认值为 。start-stop-daemontrueSpring中文文档

PID_FOLDERSpring中文文档

pid 文件夹的根名称(默认为 )。/var/runSpring中文文档

LOG_FOLDERSpring中文文档

要放入日志文件的文件夹的名称(默认情况下为 )。/var/logSpring中文文档

CONF_FOLDERSpring中文文档

要从中读取 .conf 文件的文件夹的名称(默认情况下与 jar-file 的文件夹相同)。Spring中文文档

LOG_FILENAMESpring中文文档

(默认情况下为 )中日志文件的名称。LOG_FOLDER<appname>.logSpring中文文档

APP_NAMESpring中文文档

应用的名称。 如果 jar 是从符号链接运行的,则脚本会猜测应用名称。 如果它不是符号链接,或者您想要显式设置应用程序名称,这可能很有用。Spring中文文档

RUN_ARGSSpring中文文档

要传递给程序(Spring Boot 应用)的参数。Spring中文文档

JAVA_HOMESpring中文文档

默认情况下,可执行文件的位置是使用 来发现的,但如果 中有可执行文件,则可以显式设置它。javaPATH$JAVA_HOME/bin/javaSpring中文文档

JAVA_OPTSSpring中文文档

在 JVM 启动时传递给 JVM 的选项。Spring中文文档

JARFILESpring中文文档

jar 文件的显式位置,以防脚本用于启动实际上未嵌入的 jar。Spring中文文档

DEBUGSpring中文文档

如果不为空,则在 shell 进程上设置标志,允许您查看脚本中的逻辑。-xSpring中文文档

STOP_WAIT_TIMESpring中文文档

在强制关闭之前停止应用程序时等待的时间(以秒为单位)(默认情况下)。60Spring中文文档

、 和 变量仅对服务有效。 对于 ,等效的自定义是使用“service”脚本进行的。 有关更多详细信息,请参见服务单元配置手册页PID_FOLDERLOG_FOLDERLOG_FILENAMEinit.dsystemd
如果您不喜欢将配置文件放在 jar 文件旁边,您可以设置一个环境变量来自定义配置文件的位置。CONF_FOLDER

Microsoft Windows 服务

可以使用 winsw 将 Spring Boot 应用程序作为 Windows 服务启动。Spring中文文档

一个(单独维护的示例)逐步描述了如何为 Spring Boot 应用程序创建 Windows 服务。Spring中文文档