ruta relativa proyecto obtener guarda ejecucion donde dentro con clase archivo java linux spring spring-boot

java - relativa - ¿Cómo ejecuto un contenedor ejecutable de arranque de primavera en un entorno de producción?



ruta de ejecucion (9)

El método de implementación preferido de Spring Spring es a través de un archivo jar ejecutable que contiene tomcat adentro.

Se inicia con un simple java -jar myapp.jar .

Ahora, quiero implementar ese contenedor en mi servidor Linux en EC2, ¿me falta algo o realmente necesito crear un script de inicio para iniciar correctamente la aplicación como daemon?

Si simplemente llamo a java -jar la aplicación muere cuando java -jar la sesión.

Podría iniciarlo en pantalla o nohup pero no es muy elegante y un reinicio en mi servidor me obligaría a iniciar sesión y comenzar el proceso manualmente.

Entonces, ¿hay algo para la tarea en el arranque de primavera?


Comienzo las aplicaciones que quiero ejecutar de forma persistente o al menos de forma semipermanente a través de la pantalla -dmS NAME / path / to / script. Por lo que sé, esta es la solución más elegante.


Con mucho, la forma más fácil y confiable de ejecutar aplicaciones Spring Boot en producción es con Docker. Use Docker Compose, Docker Swarm o Kubernetes si necesita usar múltiples servicios conectados.

Aquí hay un Dockerfile simple de la guía oficial de Spring Boot Docker para que comiences:

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" ]

Aquí hay una línea de comandos de muestra para ejecutar el contenedor como daemon:

docker run / -d --restart=always / -e "SPRING_PROFILES_ACTIVE=prod" / -p 8080:8080 / prefix/imagename


En el sistema operativo Windows sin servicio.

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


En un entorno de producción, desea que su aplicación se inicie nuevamente en un reinicio de máquina, etc., crear un script /etc/init.d/ y vincularlo al nivel de ejecución apropiado para iniciar y detener es el enfoque correcto. Spring Boot no se extenderá para cubrir esto ya que es una configuración específica del sistema operativo y hay toneladas de otras opciones, ¿quieres que funcione en una cárcel chroot, necesita detenerse / iniciarse antes que otro software, etc.


Esto es simple, puede usar el complemento maven de arranque de primavera para finalizar la implementación del código.

la configuración del complemento como:

<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>

Y, los jvmArtuments son para ti jvm. profiles elegirán un perfil para iniciar su aplicación. executable puede hacer que tu aplicación funcione de forma directa.

y si agrega mvnw a su proyecto, o si tiene un maven enveriment. Simplemente puede llamar a ./mvnw spring-boot:run para mvnw o mvn spring-boot:run para maven.


La aplicación de arranque My Spring tiene dos inicializadores. Uno para el desarrollo y otro para la producción. Para el desarrollo, utilizo el método principal de esta manera:

@SpringBootApplication public class MyAppInitializer { public static void main(String[] args) { SpringApplication.run(MyAppInitializer .class, args); } }

Mi inicializador para el entorno de producción extiende el SpringBootServletInitializer y se ve así:

@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); } }

Yo uso gradle y mi archivo build.gradle aplica el plugin '' WAR ''. Cuando lo ejecuto en el entorno de desarrollo, utilizo la tarea bootrun . Donde como cuando quiero implementarlo en producción, utilizo assemble task para generar WAR y desplegar.

Puedo ejecutar como una aplicación de primavera normal en producción sin descontar las ventajas proporcionadas por el tomcat incorporado durante el desarrollo. Espero que esto ayude.


Puede usar la aplicación llamada Supervisor . En la configuración del supervisor, puede definir múltiples servicios y formas de ejecutarlos.

Para las aplicaciones de arranque de Java y Spring, el comando sería java -jar springbootapp.jar .

Se pueden proporcionar opciones para mantener la aplicación ejecutándose siempre. Así que si el EC2 se reinicia, el Supervisor reiniciará su aplicación.

Encontré Supervisor fácil de usar en comparación con poner scripts de inicio en /etc/init.d/. Los scripts de inicio se colgarán o entrarán en estado de espera en caso de errores.



Tenga en cuenta que desde Spring Boot 1.3.0.M1, puede crear archivos jar completamente ejecutables usando maven y gradle.

Para maven, solo incluye lo siguiente en tu pom.xml

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>

Para gradle agrega el siguiente fragmento a tu build.gradle

springBoot { executable = true }

Estos frascos totalmente ejecutables contienen un guión adicional en la parte frontal del archivo, que le permite vincular simbólicamente el contenedor de inicio de primavera con init.d o usar un script systemd

Ejemplo init.d:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

Esto le permite iniciar, detener y reiniciar su aplicación como:

$/etc/init.d/yourapp start|stop|restart

O use un script systemd

[Unit] Description=yourapp After=syslog.target [Service] ExecStart=/var/yourapp/yourapp.jar [Install] WantedBy=multi-user.target

Más información en el siguiente enlace: http://docs.spring.io/spring-boot/docs/1.3.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service