Spring Boot War desplegado en Tomcat

Estoy intentando implementar una aplicación Spring Boot en Tomcat, porque quiero implementarlo en AWS. Creé un archivo WAR, pero parece que no se ejecuta en Tomcat, aunque está visible.

Detalles:
0. Aquí está mi aplicación:

@Configuration @ComponentScan @EnableAutoConfiguration public class App { public static void main(String[] args) { SpringApplication.run(SampleController.class, args); } } @Controller @EnableAutoConfiguration public class SampleController { @RequestMapping("/help") @ResponseBody String home() { String input = "Hi! Please use 'tag','check' and 'close' resources."; return input; } } 

application.properties tiene lo siguiente:

 server.port=${port:7777} 
  1. Después de leer varias páginas y respuestas a preguntas , agregué las siguientes a mi POM:

    http://maven.apache.org/xsd/maven-4.0.0.xsd “> 4.0.0

     com.niewlabs highlighter 1.0-SNAPSHOT war  1.8   org.springframework.boot spring-boot-starter-parent 1.1.9.RELEASE    org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-tomcat provided   
  2. Ejecuté “paquete mvn” y obtuve el archivo WAR (tamaño 250Mb), que puse en la carpeta “webapps”.

  3. Inicié Tomcat y puedo ver mi aplicación en la lista, en mi caso “/highlighter-1.0-SNAPSHOT”.
  4. Al hacer clic en el enlace de los resultados de la aplicación en la página “Estado 404”.
  5. Cuando ejecuto la aplicación Spring Boot solo, sin contenedor se ejecuta en localhost: 7777, pero no hay nada allí cuando lo ejecuto en Tomcat.

Actualización: hay otra referencia . No estoy seguro de lo útil que es.

Esta guía explica en detalle cómo implementar la aplicación Spring Boot en Tomcat:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

Esencialmente, necesitaba agregar la siguiente clase:

 public class WebInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } } 

También agregué la siguiente propiedad a POM:

  mypackage.App  

Creo que estás confundido por diferentes paradigmas aquí. En primer lugar, los archivos de guerra y la implementación del servidor: esas cosas pertenecen a Java Enterprise Edition (Java EE). Estos conceptos no tienen lugar real en una aplicación de arranque de spring, que sigue un modelo diferente.

Spring-boot es responsable de crear un contenedor integrado y ejecutar sus servicios dentro de él directamente desde archivos jar estándar (aunque puede hacer mucho más). Creo que la intención de este modelo es apoyar el desarrollo de micro-servicios, donde cada servicio tiene su propio contenedor y es completamente autónomo. Puede usar su código para generar aplicaciones Java EE también, pero sería una tontería teniendo en cuenta que el arranque de spring es mucho más fácil (para ciertos tipos de aplicaciones / servicios).

Entonces, dada esta información, ahora debes decidir qué paradigma vas a seguir, y debes seguir eso y solo eso.

Spring-boot es ejecutable; solo tiene que ejecutar el método principal en la clase de la aplicación, que puede hacer desde la línea de comandos o utilizando su IDE favorito o maven o gradle (consejo: maven es la respuesta correcta). Esto abrirá un servidor Tomcat (por defecto) y su servicio estará disponible dentro de él. Dada la configuración que publicó anteriormente, su servicio debe estar disponible en: http://localhost:7777/context/help : el context debe reemplazarse por el nombre de contexto, que no ha compartido.

No está destinado a crear una guerra, ejecutar tomcat o implementar nada. Nada de eso es necesario en spring-arranque. El embalaje en su pom debe ser jar , no war y el scope de spring-boot-starter-tomcat debe eliminarse; ciertamente no se proporciona.

Cuando ejecuta su método principal, la salida de la consola debe indicarle el contexto que ha registrado; utilízalo para obtener la URL correcta.

Habiendo dicho todo eso, Spring-boot tiene que existir en un mundo JEE por ahora (hasta que sea ampliamente adoptado). Por esa razón, las personas de spring han documentado un enfoque para construir una guerra en lugar de un contenedor ejecutable, para su implementación en un servlet o contenedor JEE. Esto permite que gran parte de la tecnología de arranque de spring se use en entornos donde existen restricciones contra el uso de todo menos guerras (u oídos). Sin embargo, esto es solo una respuesta al hecho de que dichos entornos son bastante comunes y no se consideran una parte necesaria, ni siquiera deseable, de la solución.

Hey, asegúrate de hacer estos cambios en el pom.xml

 war 

en la sección de dependencias, asegúrese de indicar que se proporciona el tomcat para que no necesite el complemento de tomcat incluido.

   org.springframework.boot spring-boot-starter-tomcat provided   org.apache.tomcat.embed tomcat-embed-jasper provided  

Este es todo el pom.xml

   4.0.0 com.example demo 0.0.1-SNAPSHOT war demo Demo project for Spring Boot  org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE     UTF-8 UTF-8 1.8 com.example.Application    org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-test test   org.springframework.boot spring-boot-starter-tomcat provided   org.apache.tomcat.embed tomcat-embed-jasper provided      org.springframework.boot spring-boot-maven-plugin     

Y la clase de aplicación debería ser así

Application.java

 package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { /** * Used when run as JAR */ public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * Used when run as WAR */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } } 

Y puede agregar un controlador para probar MyController.java

 package com.example; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { @RequestMapping("/hi") public @ResponseBody String hiThere(){ return "hello world!"; } } 

Luego puede ejecutar el proyecto en una versión de tomcat 8 y acceder al controlador de esta manera

http: // localhost: 8080 / demo / hi

Si por alguna razón no puede agregar el proyecto a tomcat haga un clic derecho en el proyecto y luego vaya a la ruta de comstackción-> configurar ruta de comstackción-> Caras del proyecto

asegúrate de que solo se seleccionen estos 3

Módulo web dynamic 3.1 Java 1.8 Javascript 1.0

Para implementar la aplicación Spring Boot en tomcat externo, siga los pasos a continuación:

Paso # 1: Agregue la siguiente dependencia a pom.xml para decirle a Spring Boot que no use su servidor incrustado:

  org.springframework.boot spring-boot-starter-tomcat provided  

Paso # 2: Cambia la propiedad de empaque a guerra:

  war  

Paso # 3 : defina su clase de inicializador de la siguiente manera:

 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 

Paso # 4 : defina la clase de inicio en pom.xml:

  com.programmer.gate.Application  

Consulte este tutorial para obtener información detallada: implementar la aplicación Spring Boot en Tomcat externo

Después de seguir la guía (o usar Spring Initializr), tuve una GUERRA que funcionaba en mi computadora local, pero no funcionaba de manera remota (ejecutándose en Tomcat).

No hubo ningún mensaje de error, solo dijo “Se encontró el inicializador del servlet de spring”, pero no hizo nada en absoluto.

 17-Aug-2016 16:58:13.552 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4 17-Aug-2016 16:58:13.593 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/ROOT.war 17-Aug-2016 16:58:16.243 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP comstacktion time. 

y

 17-Aug-2016 16:58:16.301 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath 17-Aug-2016 16:58:21.471 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext 17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized() 

Nada más sucedió. Spring Boot simplemente no se ejecutó.

Aparentemente compilé el servidor con Java 1.8, y la computadora remota tenía Java 1.7.

Después de comstackr con Java 1.7, comenzó a funcionar.

  UTF-8 UTF-8 1.7  myapp.SpringApplication  

Su clase Application.java debería extender la clase SpringBootServletInitializer ex:

 public class Application extends SpringBootServletInitializer {} 

Tuve el mismo problema y descubrí la solución siguiendo esta guía . Corro con el objective en maven.

paquete limpio

Funcionó para mí Thanq

Solución para las personas que usan Gradle

Añadir complemento a build.gradle

 apply plugin: 'war' 

Agregar dependencia provista a tomcat

 dependencies { // other dependencies providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } 

Si su objective es implementar su aplicación Spring Boot en AWS , Boxfuse le ofrece una solución muy fácil.

Todo lo que necesitas hacer es:

 boxfuse run my-spring-boot-app-1.0.jar -env=prod 

Esta voluntad:

  • Fusiona una imagen mínima del sistema operativo hecha a medida para tu aplicación (aproximadamente 100 veces más pequeña que una distribución típica de Linux)
  • Presiónalo en un repository en línea seguro
  • Convertirlo en un AMI en aproximadamente 30 segundos
  • Crear y configurar una nueva Elastic IP o ELB
  • Asignarle un nuevo nombre de dominio
  • Lanzar una o más instancias basadas en su nuevo AMI

Todas las imágenes se generan en segundos y son inmutables. Se pueden ejecutar sin cambios en VirtualBox (dev) y AWS (prueba y prod).

Todas las actualizaciones se realizan como implementaciones azul / verde sin tiempo de inactividad y también puede habilitar el escalado automático con solo un comando.

Boxfuse también entiende que su configuración de Spring Boot configurará automáticamente los grupos de seguridad y las verificaciones de estado de ELB en función de su application.properties .

Aquí hay un tutorial para ayudarlo a comenzar: https://boxfuse.com/getstarted/springboot

Descargo de responsabilidad: soy el fundador y CEO de Boxfuse

la aplicación de clase pública extiende SpringBootServletInitializer {}

solo extiende el SpringBootServletInitializer. Funcionará en su AWS / tomcat

Actualización 2018-02-03 con Spring Boot 1.5.8.RELEASE.

En pom.xml, debes indicarle a Spring plugin cuando está comstackndo que es un archivo de guerra cambiando el paquete a war, así:

 war 

Además, debe excluir el tomcat incrustado al comstackr el paquete agregando esto:

    org.springframework.boot spring-boot-starter-tomcat provided  

El ejemplo completo de runable está aquí https://www.surasint.com/spring-boot-create-war-for-tomcat/