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é.
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".
Pour le placer dans Tomcat, deux conditions doivent être remplies.
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.
@ SpringBootApplication une sous-classe de SpringBootServletInitializer.configure.** 【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);
	}
}
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()
}
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.
** 【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.
「~-0.0.1-SNAPSHOT.war」→「~.war」 ex. 「app-0.0.1-SNAPSHOT.war」→「app.war」
Placez "~ .war" dans le répertoire webapps de Tomcat. Puisque nous utilisons xampp cette fois, placez-le dans "xampp \ tomcat \ webapps".
Lancez Tomcat à partir du panneau de configuration xampp. Au démarrage, le fichier war est développé.
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.
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.
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