Spring Boot War déployé sur Tomcat

J’essaie de déployer une application Spring Boot sur Tomcat, car je souhaite le déployer sur AWS. J’ai créé un fichier WAR, mais il ne semble pas fonctionner sur Tomcat, même s’il est visible.

Détails:
0. Voici mon application:

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

application.properties a:

 server.port=${port:7777} 
  1. Après avoir lu un certain nombre de pages et de questions-réponses, j’ai ajouté à mon 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. J’ai couru “paquet de mvn” et ai obtenu le fichier WAR (taille 250Mb), que j’ai mis dans le dossier “webapps”.

  3. J’ai commencé Tomcat et je peux voir mon application dans la liste, dans mon cas “/highlighter-1.0-SNAPSHOT”.
  4. En cliquant sur le lien de l’application, vous obtenez la page “État 404”.
  5. Lorsque je lance l’application Spring Boot seule, sans conteneur, elle s’exécute sur localhost: 7777, mais il n’y a rien quand je l’exécute dans Tomcat.

Mise à jour: il y a une autre référence . Je ne suis pas sûr de son utilité.

Ce guide explique en détail comment déployer l’application Spring Boot sur Tomcat:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

Essentiellement, je devais append la classe suivante:

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

J’ai aussi ajouté la propriété suivante à POM:

  mypackage.App  

Je pense que vous êtes confus par différents paradigmes ici. Tout d’abord, les fichiers de guerre et le déploiement du serveur – ces éléments appartiennent à Java Enterprise Edition (Java EE). Ces concepts n’ont pas de place réelle dans une application Spring-Boot, qui suit un modèle différent.

Spring-boot est chargé de créer un conteneur incorporé et d’exécuter vos services directement à partir des fichiers JAR standard (bien qu’il puisse faire beaucoup plus). Je pense que le but de ce modèle est de soutenir le développement de micro-services – où chaque service a son propre conteneur et est complètement autonome. Vous pouvez également utiliser votre code pour générer des applications Java EE, mais cela serait stupide, car le démarrage à l’amorçage est beaucoup plus simple (pour certains types d’applications / services).

Donc, étant donné cette information, vous devez maintenant décider quel paradigme vous allez suivre, et vous devez suivre cela et seulement cela.

Spring-boot est exécutable – il vous suffit d’exécuter la méthode principale de la classe App que vous pouvez utiliser depuis la ligne de commande ou en utilisant votre IDE préféré ou Maven ou Gradle (astuce: Maven est la bonne réponse). Cela fera apparaître un serveur Tomcat (par défaut) et votre service sera disponible à l’intérieur. Compte tenu de la configuration que vous avez publiée au-dessus de votre service, vous devez être disponible sur: http://localhost:7777/context/help – le context doit être remplacé par votre nom de contexte, que vous n’avez pas partagé.

Vous n’êtes pas censé créer une guerre, exécuter Tomcat ou déployer quoi que ce soit. Rien de tout cela n’est nécessaire dans le démarrage du spring. Le paquetage dans votre pom devrait être jar , pas la war et la scope de spring-boot-starter-tomcat devrait être supprimée – elle n’est certainement pas fournie.

Lorsque vous exécutez votre méthode principale, la sortie de la console doit vous indiquer le contexte que vous avez enregistré. utilisez cela pour obtenir l’URL correcte.

Cela dit, Spring-Boot doit exister dans un monde JEE pour l’instant (jusqu’à ce qu’il soit largement adopté). Pour cette raison, les équipes de spring ont documenté une approche de la construction d’une guerre plutôt qu’un fichier exécutable, à déployer sur un conteneur Servlet ou JEE. Cela permet d’utiliser une grande partie de la technologie Spring-Boot dans des environnements où il n’y a pas d’autre choix que d’utiliser des guerres (ou des oreilles). Cependant, ceci est juste une réponse au fait que de tels environnements sont assez communs et ne sont pas considérés comme une partie nécessaire, voire souhaitable, de la solution.

Hey assurez-vous de faire cela change le pom.xml

 war 

Dans la section dépendances, assurez-vous d’indiquer que le tomcat est fourni, vous n’avez donc pas besoin du plug-in tomcat intégré.

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

Ceci est l’ensemble 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     

Et la classe d’application devrait être comme ça

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(Ssortingng[] args) { SpringApplication.run(Application.class, args); } /** * Used when run as WAR */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } } 

Et vous pouvez append un contrôleur pour tester 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 Ssortingng hiThere(){ return "hello world!"; } } 

Ensuite, vous pouvez exécuter le projet dans une version tomcat 8 et accéder au contrôleur comme ceci

http: // localhost: 8080 / demo / hi

Si, pour une raison quelconque, vous ne parvenez pas à append le projet à tomcat, faites un clic droit dans le projet, puis accédez au chemin de génération -> configure build path-> Project Faces.

assurez-vous que seuls ces 3 sont sélectionnés

Module Web dynamic 3.1 Java 1.8 Javascript 1.0

Après avoir suivi le guide (ou avec Spring Initializr), j’avais un WAR qui fonctionnait sur mon ordinateur local, mais qui ne fonctionnait pas à distance (fonctionnant sur Tomcat).

Il n’y avait pas de message d’erreur, il a simplement dit “L’initialiseur de servlet Spring a été trouvé”, mais n’a rien fait du tout.

 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 compilation time. 

et

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

Rien d’autre ne s’est passé. Spring Boot n’a tout simplement pas fonctionné.

Apparemment, j’ai compilé le serveur avec Java 1.8 et l’ordinateur distant avait Java 1.7.

Après avoir compilé avec Java 1.7, il a commencé à fonctionner.

  UTF-8 UTF-8 1.7  myapp.SpringApplication  

Votre classe Application.java doit étendre la classe SpringBootServletInitializer ex:

 public class Application extends SpringBootServletInitializer {} 

J’ai eu le même problème et j’ai trouvé une solution en suivant ce guide . Je cours avec le but en maven.

paquet propre

C’est travaillé pour moi Thanq

Solution pour les personnes utilisant Gradle

Ajouter un plugin à build.gradle

 apply plugin: 'war' 

Ajouter la dépendance fournie à tomcat

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

Si votre objective est de déployer votre application Spring Boot sur AWS , Boxfuse vous offre une solution très simple.

Tout ce que vous avez à faire est de:

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

Cette volonté:

  • Fusionner une image de système d’exploitation minimale adaptée à votre application (environ 100 fois plus petite qu’une dissortingbution Linux classique)
  • Poussez-le dans un référentiel en ligne sécurisé
  • Convertissez-le en une AMI en 30 secondes environ
  • Créer et configurer un nouvel Elastic IP ou ELB
  • Atsortingbuez-lui un nouveau nom de domaine
  • Lancer une ou plusieurs instances basées sur votre nouvelle AMI

Toutes les images sont générées en quelques secondes et sont immuables. Ils peuvent être exécutés sans modification sur VirtualBox (dev) et AWS (test & prod).

Toutes les mises à jour sont effectuées en tant que déploiements bleu / vert sans temps d’arrêt et vous pouvez également activer la mise à l’échelle automatique avec une seule commande.

Boxfuse comprend également que votre configuration Spring Boot configurera automatiquement les groupes de sécurité et les contrôles de santé ELB en fonction de votre application.properties .

Voici un tutoriel pour vous aider à démarrer: https://boxfuse.com/getstarted/springboot

Disclaimer: Je suis le fondateur et PDG de Boxfuse

application de classe publique étend SpringBootServletInitializer {}

étend simplement le SpringBootServletInitializer. Cela fonctionnera dans votre AWS / tomcat

Mise à jour 2018-02-03 avec Spring Boot 1.5.8.RELEASE.

Dans pom.xml, vous devez indiquer au plug-in Spring qu’il s’agit d’un fichier de guerre par package de modifications à la guerre, comme ceci:

 war 

En outre, vous devez exclure le tomcat intégré lors de la construction du package en ajoutant ceci:

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

L’exemple complet à exécuter est ici https://www.surasint.com/spring-boot-create-war-for-tomcat/