如何在生产环境中运行Spring Boot可执行jar?
如何在生产环境中运行Spring Boot可执行jar?
Spring Boot首选的部署方法是使用一个包含Tomcat的可执行jar文件。
使用简单的java -jar myapp.jar
来启动它。
现在,我想将这个jar文件部署到我的EC2上的Linux服务器上,我是否漏了些什么,我真的需要创建一个init脚本来正确地将应用程序作为守护进程启动吗?
如果我只是调用java -jar
,当我注销时应用程序会停止运行。
我可以在screen或nohup中启动它,但这不是非常优雅的解决方法,而且如果我服务器重启,我需要手动登录并启动进程。
那么,在Spring Boot中是否已经有为此任务准备好的东西?
在生产环境中运行Spring Boot应用程序,最简单可靠的方法是使用Docker。如果您需要使用多个连接的服务,则使用Docker Compose、Docker Swarm或Kubernetes。
以下是官方Spring Boot Docker指南中的简单Dockerfile
,以帮助您入门:
FROM openjdk:8-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
更好的构建Docker镜像的方法是使用Jib,这是由Google开发和维护的开源Java工具,用于构建Java应用程序的Docker镜像。使用Jib时不需要Dockerfile
,您只需要使用Maven(官方快速入门在此)或Gradle(官方快速入门在此)调用它。
以下是一个运行容器的示例命令行:
docker run \ -d --restart=always \ -e "SPRING_PROFILES_ACTIVE=prod" \ -p 8080:8080 \ prefix/imagename
请注意,自Spring Boot 1.3.0.M1版本以来,您可以使用Maven和Gradle构建完全可执行的jar包。
对于Maven,在您的pom.xml
文件中添加以下内容:
org.springframework.boot spring-boot-maven-plugin true
对于Gradle,在您的build.gradle
文件中添加以下片段:
springBoot { executable = true }
完全可执行的jar包包含文件开头的额外脚本,让您可以将Spring Boot jar包直接链接到init.d
或使用systemd
脚本。
init.d
示例:
$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
这样您就可以如下方式启动、停止和重新启动您的应用程序:
$/etc/init.d/yourapp start|stop|restart
或使用systemd
脚本:
[Unit] Description=yourapp After=syslog.target [Service] ExecStart=/var/yourapp/yourapp.jar User=yourapp WorkingDirectory=/var/yourapp SuccessExitStatus=143 [Install] WantedBy=multi-user.target
更多信息,请参考以下链接: