Spring boot的首选部署方法是通过一个包含tomcat的可执行jar文件 .
它以一个简单的 java -jar myapp.jar
开头 .
现在,我想将该jar部署到我在EC2上的linux服务器上,我是否遗漏了某些东西或者我是否真的需要创建一个init脚本来正确启动应用程序作为守护进程?
如果我只是调用 java -jar
,那么当我退出时应用程序就会死掉 .
我可以在屏幕或nohup中启动它,但这不是很优雅,我的服务器重启将迫使我登录并手动启动该过程 .
那么, Spring 季靴子的任务是否已经存在?
9 回答
请注意,自Spring Boot 1.3.0.M1以来,您可以使用Maven和Gradle构建完全可执行的jar .
对于Maven,只需在_2796263中包含以下内容:
对于Gradle,将以下代码段添加到
build.gradle
:完全可执行的jar在文件的前面包含一个额外的脚本,它允许您将Spring Boot jar符号链接到
init.d
或使用systemd
脚本 .init.d
示例:这允许您启动,停止和重新启动应用程序,如:
或者使用
systemd
脚本:更多信息,请访问以下链接:
Installation as an init.d service
Installation as a systemd service
到目前为止,在 生产环境 中运行Spring Boot应用程序最简单可靠的方法是使用Docker . 如果需要使用多个连接服务,请使用Docker Compose,Docker Swarm或Kubernetes .
这是一个简单的
Dockerfile
来自官方Spring Boot Docker guide来帮助你入门:这是一个示例命令行,用于将容器作为守护程序运行:
我的Spring启动应用程序有两个初始化程序 . 一个用于开发,另一个用于 生产环境 . 对于开发,我使用这样的main方法:
我的 生产环境 环境初始化程序扩展了 SpringBootServletInitializer ,如下所示:
我使用gradle,我的build.gradle文件应用' WAR '插件 . 当我在开发环境中运行它时,我使用 bootrun 任务 . 当我想将它部署到 生产环境 时,我使用 assemble 任务来生成WAR并进行部署 .
我可以像 生产环境 中的普通 spring 应用程序一样运行,而不会在开发时忽略内置tomcat提供的优势 . 希望这可以帮助 .
在 生产环境 环境中,您希望在计算机重启等时再次启动应用程序,创建/etc/init.d/脚本并链接到相应的运行级别以启动和停止它是正确的方法 . Spring Boot不会扩展到覆盖它,因为它是一个特定于操作系统的设置和吨其他选项,你想要它在chroot监狱中运行,是否需要在其他软件之前停止/启动等等 .
您可以使用名为Supervisor的应用程序 . 在supervisor配置中,您可以定义多个服务以及执行相同的方法 .
对于Java和Spring启动应用程序,命令将是
java -jar springbootapp.jar
.可以提供选项以使应用程序始终运行 . 因此,如果EC2重新启动,则Supervisor将重新启动应用程序
我发现Supervisor易于使用,而不是将启动脚本放在/etc/init.d/中 . 如果出现错误,启动脚本将挂起或进入等待状态 .
如果您使用的是gradle,则可以将其添加到build.gradle中
然后,您可以通过键入./your-app.jar来运行您的应用程序
此外,您可以在此处找到完整指南,将您的应用设置为服务
56.1.1 Installation as an init.d service (System V)
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
干杯
在没有服务的Windows操作系统上
start.bat
stop.bat:
run.bat
我通过screen -dmS NAME / path / to / script启动我想要持久运行或至少半永久运行的应用程序 . 据我所知,这是最优雅的解决方案 .
这很简单,你可以使用spring boot maven插件来完成你的代码部署 .
插件配置如:
并且,
jvmArtuments
为你添加jvm .profiles
将选择一个配置文件来启动您的应用 .executable
可以让你的应用程序运行得很好 .如果你将
mvnw
添加到你的项目中,或者你有一个maven环境 . 您可以为mvnw调用./mvnw spring-boot:run
或为maven调用mvn spring-boot:run
.