1. 概述
本文探讨了将 Spring 引导应用程序作为服务运行的一些选项。
首先,我们将解释 Web 应用程序的打包选项和系统服务。在随后的部分中,我们将探讨在为Linux和基于Windows的系统设置服务时的不同替代方案。
最后,我们将以一些其他信息来源的参考作为结束。
2. 项目设置和构建说明
2.1. 打包
Web 应用程序传统上打包为 Web 应用程序 (WAR) 并部署到 Web 服务器。
Spring Boot 应用程序可以打包为 WAR 和 JAR 文件。后者在 JAR 文件中嵌入了一个 Web 服务器,这允许您运行应用程序,而无需安装和配置应用程序服务器。
2.2. Maven 配置
让我们从定义pom.xml文件的配置开始:
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
....
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
Copy
包装必须设置为罐子。在撰写本文时,我们使用的是 Spring Boot 的最新稳定版本,但 1.3 之后的任何版本都足够了。您可以在此处找到有关可用版本的更多信息。
请注意,我们已将spring-boot-maven-plugin工件的 <executable>参数设置为true。这可确保清单。MF文件将添加到 JAR 包中。此清单包含一个Main-Class条目,该条目指定哪个类定义应用程序的 main 方法。
2.3. 构建您的应用程序
在应用程序的根目录中运行以下命令:
$ mvn clean package
Copy
可执行的 JAR 文件现在在目标目录中可用,我们可以通过在命令行上执行以下命令来启动应用程序:
$ java -jar your-app.jar
Copy
此时,您仍然需要使用 the-jar选项调用 Java 解释器。有很多原因说明为什么最好通过能够将其作为服务调用来启动应用。
3. 在 Linux 上
为了将程序作为后台进程运行,我们可以简单地使用nohupUnix 命令,但由于各种原因,这也不是首选方式。此线程中提供了一个很好的解释。
相反,我们将守护我们的流程。在 Linux 下,我们可以选择使用传统的System V 初始化脚本或Systemd配置文件配置守护进程。前者传统上是最著名的选择,但逐渐被后者所取代。
您可以在此处找到有关此差异的更多详细信息。
为了增强安全性,我们首先创建一个特定的用户来运行服务,并相应地更改可执行的JAR文件权限:
$ sudo useradd baeldung
$ sudo passwd baeldung
$ sudo chown baeldung:baeldung your-app.jar
$ sudo chmod 500 your-app.jar
Copy
3.1. 系统 V 初始化
Spring Boot 可执行 JAR 文件使服务设置过程变得非常简单:
$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app
Copy
上述命令创建指向可执行 JAR 文件的符号链接。您必须使用可执行 JAR 文件的完整路径,否则,符号链接将无法正常工作。通过此链接,可以将应用程序作为服务启动:
$ sudo service your-app start
Copy
该脚本支持标准服务启动、停止、重新启动和状态命令。此外:
- 它启动在我们刚刚创建的用户baeldung下运行的服务
- 它跟踪应用程序的进程 ID in/var/run/your-app/your-app.pid
- 它将控制台日志写入/var/log/your-app.log,您可能需要检查这些日志,以防应用程序无法正常启动
3.2. 系统
systemd服务设置也非常简单。首先,我们使用以下示例创建一个名为your-app.service的脚本,并将其放入 /etc/systemd/system目录中:
[Unit]
Description=A Spring Boot application
After=syslog.target
[Service]
User=baeldung
ExecStart=/path/to/your-app.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Copy
请记住修改“描述”、“用户”和“执行启动”字段以匹配您的应用程序。此时,您也应该能够执行上述标准服务命令。
与上一节中描述的System V init方法相反,进程 ID 文件和控制台日志文件应使用服务脚本中的相应字段显式配置。可以在此处找到详尽的选项列表。
3.3. 暴发户
Upstart是一个基于事件的服务管理器,是System V init的潜在替代品,它提供了对不同守护进程行为的更多控制。
该站点具有良好的设置说明,几乎适用于任何 Linux 发行版。使用 Ubuntu 时,您可能已经安装和配置了它(检查是否有任何名称以 “upstart” 开头的作业 in/etc/init)。
我们创建一个作业your-app.conf来启动我们的 Spring 启动应用程序:
# Place in /home/{user}/.config/upstart
description "Some Spring Boot application"
respawn # attempt service restart if stops abruptly
exec java -jar /path/to/your-app.jar
Copy
现在运行“启动您的应用程序”,您的服务将启动。
Upstart提供了许多作业配置选项,您可以在此处找到其中的大部分。
4. 在窗户上
在本节中,我们提供了几个可用于将Java JAR作为Windows服务运行的选项。
4.1. 窗口服务包装器
由于Java服务包装器的GPL许可证(见下一节)与Jenkins的MIT许可证相结合的困难,WindowsService Wrapper项目(也称为winsw)被构思出来。
Winsw提供以编程方式安装/卸载/启动/停止服务。此外,它可用于在Windows下将任何类型的可执行文件作为服务运行,而Java Service Wrapper,正如其名称所暗示的那样,仅支持Java应用程序。
首先,在此处下载二进制文件。接下来,定义我们的 Windows 服务 MyApp.xml 的配置文件应如下所示:
<service>
<id>MyApp</id>
<name>MyApp</name>
<description>This runs Spring Boot as a Service.</description>
<env name="MYAPP_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
<logmode>rotate</logmode>
</service>
Copy
最后,您必须将winsw.exe重命名为 MyApp.exe以便其名称与MyApp.xml配置文件匹配。此后,您可以像这样安装该服务:
$ MyApp.exe install
Copy
同样,您可以使用卸载,启动,停止等。
4.2. Java 服务包装器
如果您不介意Java Service Wrapper项目的 GPL 许可,这种替代方案可以同样很好地满足您将 JAR 文件配置为 Windows 服务的需求。基本上,Java Service Wrapper还要求您在配置文件中指定如何在Windows下将进程作为服务运行。
本文非常详细地解释了如何在 Windows 下将 JAR 文件的执行设置为服务,因此我们无需重复该信息。
5. 其他参考资料
Spring Boot 应用程序也可以作为 Windows 服务使用Apache Commons Daemon项目的Procrun启动。Procrun 是一组应用程序,允许 Windows 用户将 Java 应用程序包装为 Windows 服务。此类服务可以设置为在计算机启动时自动启动,并在没有任何用户登录的情况下继续运行。
有关在 Unix 下启动 Spring Boot 应用程序的更多详细信息,请参见此处。还有关于如何修改基于Redhat 的系统的系统单元文件的详细说明。最后
最后,这个快速操作方法描述了如何将 Bash 脚本合并到 JAR 文件中,以便它本身成为可执行文件!
6. 结论
服务允许您非常有效地管理应用程序状态,正如我们所看到的,Spring Boot 应用程序的服务设置现在比以往任何时候都更容易。
只需记住遵循有关用户权限的重要而简单的安全措施即可运行服务。