La guerre des bottes de printemps à Tomcat

j'essaie de déployer une application de démarrage à ressort pour Tomcat, parce que je veux me 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;
    }
}

de l'application.les propriétés suivantes:

server.port=${port:7777}
  1. après lecture d'un certain nombre de pages et questions-réponses j'ai ajouté ce qui suit à ma 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 lancé "mvn package" et j'ai eu le fichier WAR (taille 250Mb), que j'ai mis dans le dossier "webapps".

  3. J'ai commencé Tomcat et je suis capable de voir mon application listée, dans mon cas "/highlighter-1.0-SNAPSHOT".
  4. en cliquant sur le lien pour l'application aboutit à la page" Status 404".
  5. quand j'exécute l'application de Botte de printemps juste par lui-même, sans conteneur il fonctionne sur localhost:7777, mais il n'y a rien là-bas quand je l'exécute dans Tomcat.

mise à Jour: Il y a une autre référence . Pas sûr de savoir comment il est utile.

61
demandé sur Community 2015-01-12 17:44:29

10 réponses

ce guide explique en détail comment déployer L'application de démarrage à ressort sur Tomcat:

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

essentiellement, je devais ajouter 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:

<properties>        
    <start-class>mypackage.App</start-class>
</properties>
89
répondu Daniil Shevelev 2015-07-13 19:43:34

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

Spring-boot est responsable de la création d'un conteneur intégré et de l'exécution de vos services à l'intérieur de celui-ci directement à partir de fichiers jar standard (bien qu'il puisse faire beaucoup plus). Je pense que le but de ce modèle est d' 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 ce serait idiot si l'on considère que le spring-boot est beaucoup plus facile (pour certains types d'application/service).

donc, compte tenu de 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 -- you il suffit d'exécuter la méthode principale dans la classe App que vous pouvez faire à partir de la ligne de commande ou en utilisant votre IDE ou maven ou Grad préféré (astuce: maven est la bonne réponse). Cela affichera un serveur tomcat (par défaut) et votre service y sera disponible. Étant donné la configuration que vous avez affichée au-dessus de votre service, vous devriez être disponible à: http://localhost:7777/context/help -- le context est destiné à ê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 la botte de printemps. L'emballage dans votre pom devrait être jar , pas war et le scope du spring-boot-starter-tomcat devrait être enlevé -- 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 cela pour obtenir l'URL correcte.

cela dit, la botte à ressort doit exister en un JEE monde pour le moment (jusqu'à ce qu'il est largement adopté). Pour cette raison, les gens de spring ont documenté une approche à la construction d'une guerre plutôt qu'un pot exécutable, pour le déploiement à un conteneur servlet ou JEE. Cela permet à une grande partie de la technologie de démarrage à ressort d'être utilisé dans des environnements où il ya des restrictions contre l'utilisation de tout sauf des guerres (ou des oreilles). Toutefois, il s'agit là 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, ni même souhaitable, de la solution.

19
répondu Engineer Dollery 2016-07-13 23:58:03

assurez-vous de faire ce changement à la pom.xml

<packaging>war</packaging>

dans la section dépendances, assurez-vous d'indiquer que le 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 tout le pom.xml

<?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 doit être comme ceci

de l'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 test de 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!";
    }
}

alors 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 n'êtes pas en mesure d'ajouter le projet à tomcat, faites un clic droit dans le projet et allez ensuite sur le chemin de compilation - > configurer le chemin de compilation->visages du projet

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

module Web dynamique 3.1 Java 1.8 Javascript 1.0

15
répondu Cesar Chavez 2016-09-12 07:10:31

après avoir suivi le guide (ou en utilisant Spring Initializr), j'ai eu une guerre qui fonctionnait sur mon ordinateur local, mais ne fonctionnait pas à distance (tournant sur Tomcat).

il n'y avait pas de message d'erreur, il disait simplement" l'initialiseur de servlet à ressort a été trouvé", mais il 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()

il ne s'est rien passé d'autre. La botte de printemps n'a pas marché.

apparemment j'ai compilé le serveur avec Java 1.8, et l'ordinateur distant a 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>
2
répondu EpicPandaForce 2016-08-17 15:05:17

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

public class Application extends SpringBootServletInitializer {}
2
répondu Jaishant Biradar 2016-09-03 06:56:42

j'ai eu le même problème et je trouve la solution en suivant ce guide . Je cours avec but à maven.

emballage propre

Sa a fonctionné pour moi Thanq

2
répondu VISHWANATH N P 2017-03-28 12:33:04

Solution pour les personnes utilisant Gradle

ajouter plugin à build.gradle

apply plugin: 'war'

Ajouter fourni dépendance à tomcat

dependencies {
    // other dependencies
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
2
répondu Marcin Szymczak 2017-06-19 06:48:37

si votre objectif est de déployer votre application de Botte de printemps à AWS , Boxfuse vous donne une solution très facile.

Tout ce que vous devez faire est de:

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

Ce sera:

  • Fuse une image OS minimale sur mesure pour votre application (environ 100x plus petite qu'une distribution Linux typique)
  • Pousser à la sécurité du référentiel en ligne
  • convertissez-le en AMI en environ 30 secondes
  • créer et configurer une nouvelle IP élastique ou ELB
  • lui attribuer 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 changement sur VirtualBox (dev) et AWS (test & prod).

toutes les mises à jour sont effectuées comme zero-downtime blue/green deployments et vous pouvez également activer la mise à l'échelle automatique avec une seule commande.

Boxfuse comprend également que votre configuration de démarrage à ressort configurera automatiquement les groupes de sécurité et les contrôles de santé ELB basés sur votre application.properties .

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

avertissement: je suis le fondateur et PDG de Boxfuse

0
répondu Axel Fontaine 2015-12-17 14:46:36

public class Application extends SpringBootServletInitializer {}

ne fait que prolonger le Springbootservletinitialiseur. Il fonctionnera dans votre AWS / tomcat

0
répondu junnyea 2016-09-03 11:01:42

mise à jour 2018-02-03 avec amortisseur à ressort 1.5.8.PUBLIER.

Dans le pom.xml, vous devez dire à Spring plugin quand il construit qu'il s'agit d'un fichier war par change package en war, comme ceci:

<packaging>war</packaging>

de plus, vous devez exclure le tomcat intégré lors de la construction du paquet 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 runable complet est ici https://www.surasint.com/spring-boot-create-war-for-tomcat/

0
répondu Surasin Tancharoen 2018-02-03 14:50:31