[JAVA] Déployer le projet Spring Boot sur Tomcat dans XAMPP

introduction

SpringBoot a un tomcat intégré, et vous pouvez démarrer l'application simplement en exécutant jar. Je ne savais pas comment le déployer sur un tomcat construit séparément, alors je l'ai recherché.

Environnement de vérification

Créez une application avec Spring Boot

Créez un projet modèle pour vérification avec "Spring Initializr" avec gradle. https://start.spring.io/

Créez quelque chose comme l'API Web dans texto.

Créez un contrôleur ordinaire.

AppController.java


package warapp.app.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AppController {
    @GetMapping("/")
    public String index() {
        return "Hello World!";
    }
    @GetMapping("/hoge")
    public String hoge() {
        return "hogehoge";
    }
}

Exécutez la classe Application pour démarrer Spring Boot. J'ai pu obtenir les résultats attendus en me connectant à "localhost: 8080" et "localhost: 8080 / hoge".

Prêt à être déployé sur Tomcat

Pour le placer dans Tomcat, deux conditions doivent être remplies.

  1. Créez un fichier war
  2. Choisissez de ne pas utiliser le Tomcat intégré

Dans l'état créé par Initializr, il existe une tâche pour créer un fichier jar, mais il n'y a aucune tâche pour créer une guerre. La méthode a été officiellement écrite.

Spring Boot Reference Documentation

Tout ce que vous avez à faire est de suivre cette procédure.

Hériter de SpringBootServletInitializer

** 【Changez avant】 **

AppApplication.java


package warapp.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

** [Après modification] **

AppApplication.java


package warapp.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class AppApplication extends SpringBootServletInitializer {
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(AppApplication.class);
	}

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

Ajouter un plug-in de guerre

Ajoutez le plug-in war à build.gradle.

build.gradle


plugins {
	id 'org.springframework.boot' version '2.2.4.RELEASE'
	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
	id 'java'
}

group = 'war-app'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	developmentOnly
	runtimeClasspath {
		extendsFrom developmentOnly
	}
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

//Ajoutez une ligne ci-dessous
apply plugin: 'war'

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

Empêchez le Tomcat intégré d'interférer

Ajoutez les paramètres suivants aux dépendances.

build.gradle


plugins {
	id 'org.springframework.boot' version '2.2.4.RELEASE'
	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
	id 'java'
}

group = 'war-app'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	developmentOnly
	runtimeClasspath {
		extendsFrom developmentOnly
	}
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

apply plugin: 'war'

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
	//Ajoutez ce qui suit
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

test {
	useJUnitPlatform()
}

Vous pouvez maintenant créer le fichier war.

Créer un fichier de guerre

  1. Ouvrez la liste des tâches Gradle.
  2. Exécutez "Tasks" -> "build" -> "boot War"

** 【Résultat de l'exécution】 **

22:31:35: Executing task 'bootWar'...

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootWar

BUILD SUCCESSFUL in 1s
3 actionable tasks: 1 executed, 2 up-to-date
22:31:37: Task execution finished 'bootWar'.

Un fichier appelé "~ -0.0.1-SNAPSHOT.war" est créé sous <racine du projet> / build / libs.

Reflété dans Tomcat

Modifiez le nom du fichier war car il sera gênant ultérieurement.

「~-0.0.1-SNAPSHOT.war」→「~.war」 ex. 「app-0.0.1-SNAPSHOT.war」→「app.war」

Placement des fichiers

Placez "~ .war" dans le répertoire webapps de Tomcat. Puisque nous utilisons xampp cette fois, placez-le dans "xampp \ tomcat \ webapps".

Démarrez Tomcat

Lancez Tomcat à partir du panneau de configuration xampp. Au démarrage, le fichier war est développé.

Vérifiez le journal

Vous devriez voir l'erreur suivante dans "xampp \ tomcat \ logs \ catalina.yyyy-mm-dd.log".

console:catalina.2020-02-24.log


information:Archive d'applications Web C:\xampp\tomcat\webapps\app.Déployer la guerre
2 24, 2020 10:43:45 pm org.apache.catalina.startup.TldConfig execute
information: 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.
2 24, 2020 10:43:49 pm org.apache.catalina.core.ContainerBase addChildInternal
Sérieux: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/app]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultValidator' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:484)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:152)
	at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:132)
	at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:92)
	at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5709)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	... 10 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651)
	... 32 more
Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:88)
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:47)
	at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:474)
	at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53)
	at org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration.defaultValidator(ValidationAutoConfiguration.java:57)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 33 more

2 24, 2020 10:43:49 pm org.apache.catalina.startup.HostConfig deployWAR
Sérieux:Archive d'applications Web C:\xampp\tomcat\webapps\app.Erreur lors du déploiement de la guerre
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/app]]
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1022)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Il semble que l'erreur soit causée par l'ancienne bibliothèque javax / el / côté tomcat. La version est «2.2», mais elle doit être augmentée à «3.0» ou plus.

Téléchargez le jar 3.0 à partir du lien ci-dessous et placez-le sous "xampp \ tomcat \ libs". À ce stade, l'ancienne version de jar peut être supprimée.

Après avoir placé le pot, redémarrez Tomcat (STOP → START).

Après le démarrage, vérifiez le journal et s'il n'y a pas de trace de pile, il n'y a pas de problème.

Confirmation de déploiement

Assurez-vous qu'il est déployé dans votre navigateur.

Connectez-vous à "localhost: 8080 / app" avec un navigateur → Cochez "Hello World!" Connectez-vous à "localhost: 8080 / app / hoge" avec un navigateur → Cochez "hogehoge"

Il a été confirmé qu'il était déployé normalement.

en conclusion

J'ai été redevable à Tomcat jusqu'à présent, mais c'était une bonne étude car je ne l'avais jamais déployée moi-même. Soyez assuré que vous pouvez maintenant le gérer vous-même sans utiliser le tomcat intégré d'Eclipse et le tomcat intégré de Spring Boot. J'essaierai d'installer et de déployer dans l'environnement Linux à l'avenir.

Recommended Posts

Déployer le projet Spring Boot sur Tomcat dans XAMPP
WAR l'application WEB par Spring Boot et la déployer sur le serveur Tomcat
Déployez des applications Spring Boot sur Heroku sans utiliser la CLI Heroku
[Java] Déployer l'application Spring Boot sur Azure App Service
Déployez l'application créée par Spring Boot sur Heroku (public) ②
[Pour usage interne] Pour ceux affectés au projet Spring Boot (en construction)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Déployer l'application Spring Boot sur Elastic Beanstalk
[Spring Boot] Comment se référer au fichier de propriétés
Afficher la tâche Gradle dans le projet Spring Boot
Connectez-vous aux applications Web Spring Boot sur la plate-forme Microsoft ID
05. J'ai essayé de supprimer la source de Spring Boot
Comment créer un projet Spring Boot dans IntelliJ
J'ai essayé de réduire la capacité de Spring Boot
[Spring Boot] Comment créer un projet (pour les débutants)
Tirez parti de la barrière cyclique Spring AOP + pour garantir des conditions de test de verrouillage optimistes sur l'application Spring Boot
Spring Boot sur Microsoft Azure
Présentez Maven au projet Tomcat
Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot, partie 1
Essayez Spring Boot sur Mac
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Comment déployer Laravel sur CentOS 7
Spring Boot pour la première fois
gRPC sur Spring Boot avec grpc-spring-boot-starter
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
Déploiement à chaud avec le développement Spring Boot
Spring Boot: exemple de projet d'API Restful
Comment déployer Bootstrap sur Rails
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Comment faire coexister CsrfRequestDataValueProcessor et RequestDataValueProcessor original sur Spring Boot
Comment utiliser ModelMapper (Spring boot)
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Je veux contrôler le message d'erreur par défaut de Spring Boot
Déployer des rails sur Docker vers heroku
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.
Créez un projet de développement d'application Spring Boot avec la commande cURL + tar
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
Création d'un environnement de développement Spring Boot dans Vagrant
[Introduction à Spring Boot] Vérification de la validation du formulaire
Spring Boot 2.0.0 ne démarre pas le Tomcat intégré
Mémo de construction de l'environnement Spring Boot sur Mac
Lancer un (ancien) projet Spring Boot avec IntelliJ
Déployer les applications JavaServlet localement dans Tomcat
Déployer sur Heroku [Ruby on Rails] Débutant
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Essayez Spring Boot 1 (Construction de l'environnement ~ Démarrage de Tomcat)
Comment diviser un fichier de message Spring Boot
Déployer un projet Eclipse basé sur Tomcat sur Heroku
Pré-traitement à afficher sur le navigateur (compilateur)
Ajoutez une botte de printemps et un dégradé à éclipse
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot