[JAVA] Stellen Sie das Spring Boot-Projekt in XAMPP für Tomcat bereit

Einführung

SpringBoot hat einen eingebauten Tomcat und Sie können die App starten, indem Sie jar ausführen. Ich wusste nicht, wie ich es auf einem separat gebauten "Tomcat" bereitstellen sollte, also habe ich es nachgeschlagen.

Überprüfungsumgebung

Erstellen Sie eine App mit Spring Boot

Erstellen Sie mit "Spring Initializr" ein Vorlagenprojekt zur Überprüfung mit gradle. https://start.spring.io/

Machen Sie so etwas wie eine Web-API im Text.

Erstellen Sie einen normalen Controller.

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";
    }
}

Führen Sie die Anwendungsklasse aus, um Spring Boot zu starten. Ich konnte die erwarteten Ergebnisse erzielen, indem ich eine Verbindung zu "localhost: 8080" und "localhost: 8080 / hoge" herstellte.

Bereit zur Bereitstellung für Tomcat

Um es in Tomcat zu platzieren, müssen zwei Bedingungen erfüllt sein.

  1. Erstellen Sie eine Kriegsdatei
  2. Verwenden Sie den integrierten Tomcat nicht

In dem von Initializr erstellten Zustand gibt es eine Aufgabe, ein Glas zu erstellen, aber es gibt keine Aufgabe, einen Krieg zu erstellen. Die Methode wurde offiziell geschrieben.

Spring Boot Reference Documentation

Alles was Sie tun müssen, ist dieses Verfahren zu befolgen.

SpringBootServletInitializer erben

** 【Vor】 ändern **

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);
	}
}

** [Nach der veränderung] **

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);
	}
}

Kriegs-Plug-In hinzufügen

Fügen Sie das Kriegs-Plug-In zu "build.gradle" hinzu.

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()
}

//Fügen Sie eine Zeile darunter hinzu
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()
}

Verhindern Sie, dass der eingebaute Tomcat stört

Fügen Sie die folgenden Einstellungen zu "Abhängigkeiten" hinzu.

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'
	}
	//Fügen Sie Folgendes hinzu
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

test {
	useJUnitPlatform()
}

Jetzt können Sie die Kriegsdatei erstellen.

Kriegsdatei erstellen

  1. Öffnen Sie die Gradle-Aufgabenliste.
  2. Führen Sie "Aufgaben" -> "Build" -> "Boot War" aus

** 【Ausführungsergebnis】 **

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'.

Eine Datei mit dem Namen "~ -0.0.1-SNAPSHOT.war" wird unter " / build / libs" erstellt.

In Tomcat reflektiert

Ändern Sie den Namen der Kriegsdatei, da dies später problematisch ist.

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

Dateipositionierung

Platzieren Sie "~ .war" im Webanwendungsverzeichnis von Tomcat. Da wir diesmal xampp verwenden, platzieren Sie es in "xampp \ tomcat \ webapps".

Starten Sie Tomcat

Starten Sie Tomcat über das xampp-Kontrollfeld. Beim Start wird die Kriegsdatei erweitert.

Überprüfen Sie das Protokoll

Der folgende Fehler sollte in "xampp \ tomcat \ logs \ catalogina.yyyy-mm-dd.log" angezeigt werden.

console:catalina.2020-02-24.log


Information:Webanwendungsarchiv C.:\xampp\tomcat\webapps\app.Krieg einsetzen
2 24, 2020 10:43:45 Uhr 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 Uhr org.apache.catalina.core.ContainerBase addChildInternal
Ernst: 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 Uhr org.apache.catalina.startup.HostConfig deployWAR
Ernst:Webanwendungsarchiv C.:\xampp\tomcat\webapps\app.Fehler beim Bereitstellen des Krieges
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)

Es scheint, dass der Fehler durch die alte javax / el / Bibliothek auf der Tomcat-Seite verursacht wird. Die Version ist 2.2, muss aber auf 3.0 oder höher angehoben werden.

Laden Sie das 3.0-Glas über den folgenden Link herunter und platzieren Sie es unter "xampp \ tomcat \ libs". Zu diesem Zeitpunkt kann die alte Version von jar gelöscht werden.

Starten Sie Tomcat nach dem Platzieren des Glases neu (STOP → START).

Überprüfen Sie nach dem Start das Protokoll. Wenn keine Stapelverfolgung vorhanden ist, liegt kein Problem vor.

Bereitstellungsbestätigung

Stellen Sie sicher, dass es in Ihrem Browser bereitgestellt wird.

Stellen Sie mit einem Browser eine Verbindung zu "localhost: 8080 / app" her → Aktivieren Sie "Hallo Welt!" Stellen Sie mit einem Browser eine Verbindung zu "localhost: 8080 / app / hoge" her → Aktivieren Sie "hogehoge"

Es wurde bestätigt, dass es normal bereitgestellt wurde.

abschließend

Ich war bis jetzt Tomcat zu Dank verpflichtet, aber es war eine gute Studie, weil ich sie selbst nie eingesetzt hatte. Seien Sie versichert, dass Sie jetzt selbst damit umgehen können, ohne den integrierten Tomcat von Eclipse und den integrierten Tomcat von Spring Boot zu verwenden. Ich werde in Zukunft versuchen, die Linux-Umgebung zu installieren und bereitzustellen.

Recommended Posts

Stellen Sie das Spring Boot-Projekt in XAMPP für Tomcat bereit
WAR die WEB-Anwendung per Spring Boot und stellen Sie sie auf dem Tomcat-Server bereit
Stellen Sie Spring Boot-Anwendungen für Heroku bereit, ohne die Heroku-CLI zu verwenden
[Java] Stellen Sie die Spring Boot-Anwendung für den Azure App Service bereit
Stellen Sie die von Spring Boot erstellte Anwendung für Heroku (öffentlich) bereit ②
[Für den internen Gebrauch] Für diejenigen, die dem Spring Boot-Projekt zugewiesen sind (im Aufbau)
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Stellen Sie die Spring Boot-Anwendung für Elastic Beanstalk bereit
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Melden Sie sich bei Spring Boot-Webanwendungen auf der Microsoft ID-Plattform an
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Nutzen Sie Spring AOP + Cyclic Barrier, um optimistische Verriegelungstestbedingungen in der Spring Boot-App sicherzustellen
Spring Boot unter Microsoft Azure
Stellen Sie Maven das Tomcat-Projekt vor
Einführung in Spring Boot ② ~ AOP ~
Einführung in Spring Boot Teil 1
Versuchen Sie Spring Boot auf dem Mac
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
So stellen Sie Laravel für CentOS 7 bereit
Spring Boot zum ersten Mal
gRPC auf Spring Boot mit grpc-spring-boot-Starter
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
Hot Deploy mit Spring Boot-Entwicklung
Spring Boot: Restful API-Beispielprojekt
So stellen Sie Bootstrap auf Rails bereit
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
So stellen Sie sicher, dass CsrfRequestDataValueProcessor und der ursprüngliche RequestDataValueProcessor beim Spring Boot nebeneinander existieren
Verwendung von ModelMapper (Spring Boot)
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Stellen Sie Rails on Docker für Heroku bereit
So wenden Sie Thymeleaf-Änderungen sofort mit #Spring Boot + maven auf den Browser an
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.
Erstellen Sie mit dem Befehl cURL + tar ein Spring Boot-App-Entwicklungsprojekt
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
Ich habe Docker verwendet, um die Vorlage zu verfestigen, die mit Spring Boot entwickelt werden soll.
Erstellen einer Spring Boot-Entwicklungsumgebung in Vagrant
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
Spring Boot 2.0.0 startet den integrierten Tomcat nicht
Spring Boot Umgebungskonstruktionsnotiz auf Mac
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Stellen Sie JavaServlet-Apps lokal in Tomcat bereit
Bereitstellen für Heroku [Ruby on Rails] Anfänger
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Versuchen Sie Spring Boot 1 (Umgebungskonstruktion ~ Tomcat-Start)
So teilen Sie eine Spring Boot-Nachrichtendatei
Stellen Sie ein Tomcat-basiertes Eclipse-Projekt für Heroku bereit
Vorverarbeitung zur Anzeige im Browser (Compiler)
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest