web-dev-qa-db-fra.com

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(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 a:

server.port=${port:7777}
  1. Après avoir lu un certain nombre de pages et question-réponses , j'ai ajouté ce qui suit à mon POM:

    http://maven.Apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

    <groupId>com.niewlabs</groupId>
    <artifactId>highlighter</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <packaging>war</packaging>
    
    <properties>
        <Java.version>1.8</Java.version>
    </properties>    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.9.RELEASE</version>
    </parent>    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
  2. J'ai couru "le paquet mvn" et ai obtenu le fichier WAR (taille 250Mb), que j'ai mis dans le dossier "webapps".

  3. J'ai lancé Tomcat et je peux voir mon application répertoriée, dans mon cas "/highlighter-1.0-SNAPSHOT".
  4. Cliquez sur le lien de l'application pour afficher la page "Statut 404".
  5. Lorsque j'exécute l'application Spring Boot tout seul, sans conteneur, il s'exécute sur localhost: 7777, mais il n'y a rien là-bas lorsque je l'exécute dans Tomcat.

Mise à jour: Il y a un autre référence . Je ne sais pas à quel point c'est utile.

69
Daniil Shevelev

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 ajouter le cours suivant:

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:

<properties>        
    <start-class>mypackage.App</start-class>
</properties>
101
Daniil Shevelev

Je pense que vous êtes déroutés par différents paradigmes ici. Premièrement, les fichiers war et le déploiement du serveur - ces éléments appartiennent à Java Enterprise Edition (Java EE). Ces concepts n'ont aucune place réelle dans une application Spring-Boot, qui suit un modèle différent.

Spring-Boot est responsable de la création d'un conteneur incorporé et de l'exécution de vos services directement à partir de fichiers jar standard (bien qu'il puisse en faire beaucoup plus). Je pense que l'intention de ce modèle est de soutenir le développement de micro-services - chaque service ayant son propre conteneur et étant complètement autonome. Vous pouvez également utiliser votre code pour générer Java EE applications, mais ce serait idiot de penser que Spring-Boot est beaucoup plus simple (pour certains types d'application/service).

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

Spring-boot est exécutable - vous devez simplement exécuter la méthode principale dans la classe App, ce que vous pouvez faire depuis la ligne de commande ou en utilisant votre favori IDE, maven ou gradle (astuce: maven est la bonne réponse ). Cela fera apparaître un serveur Tomcat (par défaut) et votre service y sera disponible. Compte tenu de la configuration que vous avez affichée au-dessus de votre service, vous devriez être disponible à l'adresse suivante: http://localhost:7777/context/help - la context doit être remplacée 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 Spring-Boot. L'emballage de votre pom devrait être jar, pas war et le scope du spring-boot-starter-Tomcat devrait être supprimé - il n'est certainement pas fourni.

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

Cela dit, Spring-Boot doit exister dans un monde JEE pour le moment (jusqu'à ce qu'il soit largement adopté). Pour cette raison, les gens du printemps ont documenté une approche de la construction d'une guerre plutôt que d'un fichier jar exécutable, pour un déploiement sur une servlet ou un conteneur JEE. Cela permet à une grande partie de la technologie spring-boot d'être utilisée dans des environnements où il existe des restrictions d'utilisation, sauf les guerres (ou les oreilles). Cependant, il ne s'agit que d'une réponse au fait que de tels environnements sont assez courants et ne sont pas considérés comme une partie nécessaire, voire souhaitable, de la solution.

20
Engineer Dollery

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

<packaging>war</packaging>

dans la section des dépendances, assurez-vous d’indiquer que Tomcat est fourni afin que vous n’ayez pas besoin du plugin Tomcat intégré.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <scope>provided</scope>
    </dependency>       

    <dependency>
        <groupId>org.Apache.Tomcat.embed</groupId>
        <artifactId>Tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>       

C'est le pom.xml entier

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <Java.version>1.8</Java.version>
        <start-class>com.example.Application</start-class>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>       

        <dependency>
            <groupId>org.Apache.Tomcat.embed</groupId>
            <artifactId>Tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>       

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

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(String[] 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 ajouter 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 String hiThere(){
        return "hello world!";
    }
}

Ensuite, vous pouvez exécuter le projet dans une version de Tomcat 8 et accéder au contrôleur de la manière suivante:

http: // localhost: 8080/demo/hi

Si, pour une raison quelconque, vous ne pouvez pas ajouter le projet à Tomcat, faites un clic droit dans le projet, puis accédez au chemin de construction -> configurer le chemin de construction -> Faces du projet.

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

Module Web dynamique 3.1 Java 1.8 Javascript 1.0

19
Cesar Chavez

Votre classe Application.Java devrait étendre la classe SpringBootServletInitializer, par exemple:

public class Application extends SpringBootServletInitializer {}
5
Jaishant Biradar

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'
}
4
Marcin Szymczak

classe publique Application étend SpringBootServletInitializer {}

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

3
junnyea

Après avoir suivi le guide (ou utilisé Spring Initializr), j'ai eu un fichier WAR qui fonctionnait sur mon ordinateur local, mais ne fonctionnait pas à distance (s'exécutant sur Tomcat).

Il n'y avait pas de message d'erreur, il a juste dit "l'initialiseur de servlet de 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 n'est arrivé. 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.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <Java.version>1.7</Java.version> <!-- added this line -->
    <start-class>myapp.SpringApplication</start-class>
</properties>
3
EpicPandaForce

J'ai eu le même problème et je trouve une solution en suivant ceci guide . Je cours avec but dans Maven.

paquet propre

Ça a fonctionné pour moi Thanq

3
VISHWANATH N P

Si vous créez une nouvelle application au lieu de convertir une application existante, le moyen le plus simple de créer une application de démarrage basée sur WAR consiste à utiliser Spring Initializr .

Il génère automatiquement l'application pour vous. Par défaut, il crée un fichier Jar, mais dans les options avancées, vous pouvez choisir de créer un fichier WAR. Cette guerre peut également être exécutée directement.

enter image description here

Encore plus facile est de créer le projet à partir d’IntelliJ IDEA directement:

Fichier → Nouveau projet → Spring Initializr

1
Vojtech Ruzicka

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

Tout ce que vous devez faire c'est:

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

Cette volonté:

  • Fusionnez une image de système d'exploitation minimale adaptée à votre application (environ 100 fois plus petite qu'une distribution Linux classique)
  • Transférez-le dans un référentiel en ligne sécurisé
  • Convertissez-le en une AMI en environ 30 secondes
  • Créer et configurer un nouvel IP ou ELB Elastic
  • Attribuez-lui un nouveau nom de domaine
  • Lancez une ou plusieurs instances en fonction de 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 sous forme de déploiements bleu/vert sans temps d'arrêt et vous pouvez également activer la mise à l'échelle automatique à l'aide d'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

Avertissement: je suis le fondateur et le PDG de Boxfuse

0
Axel Fontaine

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

Dans pom.xml, vous devez indiquer au plug-in Spring, lors de la construction, qu'il s'agit d'un fichier war par paquet modifié en fichier war, comme ceci:

<packaging>war</packaging>

De plus, vous devez exclure le Tomcat intégré lors de la construction du package en ajoutant ceci:

    <!-- to deploy as a war in Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

L'exemple complet exécutable est ici https://www.surasint.com/spring-boot-create-war-for-Tomcat/

0
Surasin Tancharoen