如何在生产环境中运行一个spring引导可执行文件jar?
Spring Boot的首选部署方法是通过一个包含tomcat的可执行jar文件。
它是从一个简单的java -jar myapp.jar
。
现在,我想在EC2上将该jar部署到我的linux服务器上,我是否错过了一些东西,或者是否真的需要创build一个init脚本来正确启动应用程序作为后台进程?
如果我简单地调用java -jar
则应用程序将在注销时死亡。
我可以在屏幕或nohup启动它,但是这不是很优雅,并在我的服务器重新启动将迫使我login并手动启动该过程。
那么,有没有什么东西在春季启动的任务?
请注意,由于Spring Boot 1.3.0.M1,您可以使用maven和gradle构build完全可执行的jar文件。
对于maven,只需在你的pom.xml中包含以下内容
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
为gradle添加以下片段到您的build.gradle
springBoot { executable = true }
这些完全可执行的jar文件在文件的前面包含一个额外的脚本,它允许你将spring引导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 [Install] WantedBy=multi-user.target
更多信息请访问以下链接: http : //docs.spring.io/spring-boot/docs/1.3.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service
我的Spring启动应用程序有两个初始化程序。 一个用于开发,另一个用于生产。 对于开发,我使用这样的主要方法:
@SpringBootApplication public class MyAppInitializer { public static void main(String[] args) { SpringApplication.run(MyAppInitializer .class, args); } }
我的生产环境初始化程序扩展了SpringBootServletInitializer ,如下所示:
@SpringBootApplication public class MyAppInitializerServlet extends SpringBootServletInitializer{ private static final Logger log = Logger .getLogger(SpringBootServletInitializer.class); @Override protected SpringApplicationBuilder configure( SpringApplicationBuilder builder) { log.trace("Initializing the application"); return builder.sources(MyAppInitializerServlet .class); } }
我使用gradle和我的build.gradle文件应用' WAR '插件。 当我在开发环境中运行它时,我使用bootrun任务。 当我想要将其部署到生产环境时,我使用汇编任务来生成WAR并进行部署。
我可以在生产环境中像普通的spring应用程序一样运行,而不必在开发时忽略内置的tomcat提供的优势。 希望这可以帮助。
在生产环境中,您希望您的应用程序在重新启动计算机时重新启动等,创build/etc/init.d/脚本并链接到适当的运行级别以启动和停止它是正确的方法。 Spring Boot不会延伸到覆盖这个,因为它是一个操作系统特定的设置,其他选项是吨,你希望它在一个chroot监狱运行,是否需要停止/启动之前,其他软件等
如果你正在使用gradle,你可以把它添加到你的build.gradle中
springBoot { executable = true }
然后你可以input./your-app.jar来运行你的应用程序
另外,您可以在这里find一个完整的指南,将您的应用程序设置为服务
56.1.1作为init.d服务安装(System V)
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
干杯
我启动应用程序,我想永久运行或至less半永久运行通过屏幕-dmS NAME / path / to / script。 据我所知这是最优雅的解决scheme。
您可以使用名为Supervisor的应用程序。 在pipe理员configuration中,您可以定义多个服务和执行相同的方法。
对于Java和Spring引导应用程序,该命令将是java -jar springbootapp.jar
。
可以提供选项以保持应用程序始终运行。因此,如果EC2重新启动,Supervisor将重新启动应用程序
与将启动脚本放在/etc/init.d/中相比,我发现Supervisor易于使用。启动脚本会挂起或进入等待状态,以防出错。
到目前为止,在生产中运行Spring Boot应用程序的最简单可靠的方法是使用Docker。 如果您需要使用多个连接的服务,请使用Docker Compose,Docker Swarm或Kubernetes。
下面是官方的Spring Boot Docker指南中的一个简单的Dockerfile
,以帮助您开始:
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD YOUR-APP-NAME.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
下面是一个示例命令行来运行容器作为守护进程:
docker run \ -d --restart=always \ -e "SPRING_PROFILES_ACTIVE=prod" \ -p 8080:8080 \ prefix/imagename
这很简单,你可以使用spring boot maven插件来完成你的代码部署。
插件configuration如下所示:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port} </jvmArguments> <profiles> <profile>test</profile> </profiles> <executable>true</executable> </configuration> </plugin>
而且, jvmArtuments
是为你添加jvm的。 profiles
将select一个configuration文件来启动你的应用 executable
可以让你的应用程序运行。
如果你添加mvnw
到你的项目中,或者你有一个maven enveriment。 你可以调用./mvnw spring-boot:run
mvnw或者mvn spring-boot:run
maven。
在没有服务的Windows OS上。
的start.bat
@ECHO OFF call run.bat start
stop.bat且:
@ECHO OFF call run.bat stop
的run.bat
@ECHO OFF IF "%1"=="start" ( ECHO start myapp start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar ) ELSE IF "%1"=="stop" ( ECHO stop myapp TASKKILL /FI "WINDOWTITLE eq myapp" ) ELSE ( ECHO please, use "run.bat start" or "run.bat stop" ) pause