如何在生产环境中运行一个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