web-dev-qa-db-fra.com

Déployer Spring Boot sur Tomcat

Donc, je suis nouveau au printemps - alors j'ai pensé essayer Spring Boot

J'utilise un Maven pour construire - j'ai configuré une vue, lorsque je l'exécute en tant qu '"application", il semble qu'il lance Tomcat lui-même et que je dispose d'un service sur le port 8080 par défaut. Par conséquent, lorsque j'appelle localhost:8080/service, tout va bien.

Cependant, lorsque j'essaie de le conditionner en tant que fichier WAR à déployer sur un serveur, cela ne fonctionne pas.

J'ai donc pensé revenir aux bases et les déployer localement sur mon serveur Tomcat pour voir ce qui se passe.

Donc, tout d’abord, rien n’est arrivé - 404 - a fait un peu de recherche sur google pour découvrir que je devais inclure un point d’entrée Web comme celui-ci - voici ma classe principale

@ComponentScan
@EnableAutoConfiguration
public class App extends SpringBootServletInitializer
{

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(appClass);
    }

    private static Class<App> appClass = App.class;
}

il a donc semblé que cela a fonctionné, dans la console je pouvais voir le texte de démarrage de catalina rouge, puis j'ai vu le démarrage de Spring (que je ne voyais pas auparavant) 

cependant, lorsque j'essaie d'appeler le service localhost:8080/service, je reçois toujours un 404.

quand je le lance comme "App" cela fonctionne un régal

y a-t-il quelque chose d'évident que je devrais faire? pour créer la guerre je viens

  1. changé le type de paquet pom xml en war
  2. inclus le remplacement dans l'extrait de code ci-dessus
  3. exporté comme une guerre

j'ai décompressé le fichier WAR et tout semblait aller bien - il y a un WEB-INF et un ensemble de dépendances, etc.

toute aide serait utile - puisque quiconque avait des problèmes similaires lors du déploiement d'applications Spring Boot en tant que WAR?

***METTRE À JOUR****

Maintenant, je peux faire en sorte que ma guerre se déploie correctement sur mon serveur Tomcat 7 local. 

at       org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.Java:175)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5262)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
... 15 more
Jul 14, 2014 1:49:01 PM org.Apache.catalina.startup.HostConfig deployDirectory
SEVERE: Error deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/cookpot
Java.lang.IllegalStateException: ContainerBase.addChild: start: org.Apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cookpot]]
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:898)
at org.Apache.catalina.core.ContainerBase.access$000(ContainerBase.Java:130)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:153)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:142)
at Java.security.AccessController.doPrivileged(Native Method)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:869)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:615)
at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:1095)
at org.Apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.Java:1617)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:441)
at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:303)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:138)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908)
at Java.lang.Thread.run(Thread.Java:619)
Jul 14, 2014 1:49:01 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/examples
Jul 14, 2014 1:49:01 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/Host-manager
Jul 14, 2014 1:49:01 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/CookPot
Jul 14, 2014 1:49:02 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/shared/Tomcat/thecookpot/webapps/CookPot/WEB-INF/lib/Tomcat-embed-core-7.0.52.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 14, 2014 1:49:02 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/shared/Tomcat/thecookpot/webapps/CookPot/WEB-INF/lib/Tomcat-embed-el-7.0.52.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
Jul 14, 2014 1:49:06 PM org.Apache.catalina.core.ContainerBase addChildInternal
SEVERE: ContainerBase.addChild: start:
org.Apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/CookPot]]
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:154)
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:895)
at org.Apache.catalina.core.ContainerBase.access$000(ContainerBase.Java:130)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:153)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:142)
at Java.security.AccessController.doPrivileged(Native Method)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:869)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:615)
at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:1095)
at org.Apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.Java:1617)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:441)
at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:303)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:138)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908)
at Java.lang.Thread.run(Thread.Java:619)
Caused by: Java.security.AccessControlException: access denied (Java.util.PropertyPermission Java.awt.headless write)
at Java.security.AccessControlContext.checkPermission(AccessControlContext.Java:323)
at Java.security.AccessController.checkPermission(AccessController.Java:546)
at Java.lang.SecurityManager.checkPermission(SecurityManager.Java:532)
at Java.lang.System.setProperty(System.Java:727)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:263)
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.Java:130)
at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.Java:89)
at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.Java:51)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.Java:175)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5262)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
... 15 more
Jul 14, 2014 1:49:06 PM org.Apache.catalina.startup.HostConfig deployDirectory
SEVERE: Error deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/CookPot
Java.lang.IllegalStateException: ContainerBase.addChild: start: org.Apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/CookPot]]
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:898)
at org.Apache.catalina.core.ContainerBase.access$000(ContainerBase.Java:130)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:153)
at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:142)
at Java.security.AccessController.doPrivileged(Native Method)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:869)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:615)
at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:1095)
at org.Apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.Java:1617)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:441)
at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:303)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:138)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908)
at Java.lang.Thread.run(Thread.Java:619)
Jul 14, 2014 1:49:06 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/ROOT
Jul 14, 2014 1:49:06 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/manager
Jul 14, 2014 1:49:06 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/docs
Jul 14, 2014 1:49:06 PM org.Apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/shared/Tomcat/thecookpot/webapps/Cookpot
Jul 14, 2014 1:49:06 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/shared/Tomcat/thecookpot/webapps/Cookpot/WEB-INF/lib/Tomcat-embed-core-7.0.52.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 14, 2014 1:49:06 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/shared/Tomcat/thecookpot/webapps/Cookpot/WEB-INF/lib/Tomcat-embed-el-7.0.52.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
Jul 14, 2014 1:49:09 PM org.Apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-6350"]
Jul 14, 2014 1:49:09 PM org.Apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-4350"]
Jul 14, 2014 1:49:09 PM org.Apache.catalina.startup.Catalina start
INFO: Server startup in 17529 ms
29
philthomas26

Le chapitre Emballage des fichiers jar et war exécutables dans la documentation de référence de Spring Boot indique:

Pour créer un fichier war à la fois exécutable et déployable dans un conteneur externe, vous devez marquer les dépendances du conteneur incorporé comme étant "fournies", par exemple:

<?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">
    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->
    <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>
</project>
35
James

Le code ci-dessous a bien fonctionné pour le déploiement de Tomcat8 sans dépendance à Tomcat.

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class ManufacturingRegionApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
    new SpringApplicationBuilder(ManufacturingRegionApplication.class).application().run(args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
    return applicationBuilder.sources(application);
}

private static Class<ManufacturingRegionApplication> application = ManufacturingRegionApplication.class;

}

La dépendance ci-dessous n'est pas requise.

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

 @RestController
 @RequestMapping(value = "/manufacturing-region-service")
 public class ManufacturingRegionService {

@Resource
private ManufacturingRegionDao manufacturingRegionDao;

@ResponseBody
@Transactional(readOnly = true)
@RequestMapping(value = "/region-codes/{abbr}", method = GET, produces = "application/json")

http: // localhost: 8080/fabrication-région-api/fabrication-région-service/région-codes/ABBRVALUE

5
Sandeep M

Lorsque nous choisissons Spring Boot, nous ne voulons pas produire de fichier WAR. Depuis la page root :

Spring Boot makes it easy to create stand-alone [...] 
Applications that can you can "just run".
Embed Tomcat or Jetty directly (no need to deploy WAR files)

EDITED: Donc, si le but est "d'essayer Spring Boot", je suggère de ne pas générer de fichier WAR.

Si vous avez vraiment besoin de produire un fichier WAR (conservez votre code construit avec SpringBoot et créez un fichier que vous pouvez exécuter dans n'importe quel conteneur de servlet standard ...), lisez la documentation Conversion d'une application Spring Boot JAR en fichier WAR .

Avez-vous inclus spring-boot-maven-plugin dans le processus de construction? Vous n'avez pas décrit cette étape ...

0
mcoolive