Tomcat에 전개된 스프링 부트 전쟁
AWS에 배포하고 싶기 때문에 Tomcat에 Spring Boot 앱을 배포하려고 합니다.WAR 파일을 작성했습니다만, Tomcat에서는 동작하지 않는 것 같습니다.
★★★★★★★★★★★★★★★★★★:
이 있습니다: 0. 내 앱은 다음과 같습니다.
@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;
}
}
application.properties는 다음과 같습니다.
server.port=${port:7777}
여러 페이지와 질의응답 내용을 읽은 후 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>
"mvn package"를 실행하여 WAR 파일(250Mb 크기)을 "webapps" 폴더에 넣었습니다.
- Tomcat 를 기동하면, 앱이 일람표시됩니다(내 경우는 /highlighter-1.0-SNAPSHOT).
- 앱 링크를 클릭하면 "상태 404" 페이지가 나타납니다.
- Spring Boot 앱을 단독으로 실행하면 컨테이너 없이 localhost:777에서 실행되지만 Tomcat에서 실행하면 아무것도 없습니다.
업데이트: 다른 참조가 있습니다.그게 얼마나 유용한지 모르겠어.
기본적으로 다음 클래스를 추가해야 했습니다.
public class WebInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(App.class);
}
}
또한 POM에 다음 속성을 추가했습니다.
<properties>
<start-class>mypackage.App</start-class>
</properties>
pom.xml에 변경을 가하는 것을 잊지 마세요.
<packaging>war</packaging>
dependencies 섹션에서 Tomcat이 제공되었음을 나타내면 내장된 Tomcat 플러그인이 필요하지 않습니다.
<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>
이게 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>
어플리케이션 클래스는 다음과 같습니다.
어플.자바
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);
}
}
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!";
}
}
그런 다음 Tomcat 8 버전에서 프로젝트를 실행하고 컨트롤러에 이렇게 액세스할 수 있습니다.
어떤 이유로 Tomcat에 프로젝트를 추가할 수 없는 경우 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후 빌드 경로 구성 -> 빌드 경로 -> 프로젝트 페이스로 이동합니다.
이 3개만 선택되었는지 확인합니다.
Dynamic Web Module 3.1 Java 1.8 Javascript 1.0
다른 패러다임 때문에 헷갈리시는 것 같아요.첫째, 전쟁 파일과 서버 배포입니다. 이것들은 Java Enterprise Edition(Java EE)에 속합니다.이러한 개념은 다른 모델을 따르는 스프링 부트 애플리케이션에는 실제로 존재하지 않습니다.
스프링 부트는 임베디드 컨테이너를 만들고 표준 jar 파일에서 직접 서비스를 실행하는 역할을 합니다(단, 더 많은 작업을 수행할 수 있습니다).이 모델의 목적은 마이크로 서비스 개발을 지원하는 것이라고 생각합니다.각 서비스에는 자체 컨테이너가 있으며 완전히 자체 억제되어 있습니다.코드를 사용하여 Java EE 앱을 생성할 수도 있지만, 스프링 부팅이 훨씬 더 쉽다는 것을 고려하면 이는 어리석은 일입니다(특정 유형의 애플리케이션/서비스).
따라서 이 정보를 바탕으로 어떤 패러다임을 따를지 결정해야 합니다.그리고 이것만 따라야 합니다.
스프링 부츠 앱 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」이 메서드는 명령줄에서 실행하거나 마음에 드는 IDE, maven 또는 gradle을 사용하여 실행할 수 있습니다(팁: maven이 정답입니다).이것에 의해, (디폴트) Tomcat 서버가 기동해, 그 안에서 서비스를 이용할 수 있게 됩니다.하면, 의 URL 로 할 수 있습니다.http://localhost:7777/context/help
context
공유하지 않은 컨텍스트 이름으로 대체해야 합니다.
전쟁을 만들거나, Tomcat을 실행하거나, 어떤 것도 배포할 수 없습니다.스프링 부츠에는 그 중 어느 것도 필요하지 않습니다.당신의 pom의 포장은 다음과 같아야 합니다.jar
아니라, 이에요.war
및scope
spring-boot-starter-tomcat
삭제해야 합니다.확실히 제공되지 않습니다.
메인 메서드를 실행하면 콘솔 출력에 등록한 컨텍스트가 표시됩니다.이 컨텍스트를 사용하여 URL을 올바르게 가져옵니다.
그러나 스프링 부트는 현재 JEE의 세계에 존재해야 합니다(그것이 널리 채택될 때까지).이러한 이유로 봄철 사람들은 서블릿이나 JEE 컨테이너에 배치하기 위해 실행 가능한 항아리가 아닌 전쟁을 구축하는 방법을 문서화했습니다.이를 통해 많은 스프링 부트 기술을 전쟁(또는 귀) 이외의 사용을 제한하는 환경에서 사용할 수 있습니다.그러나 이는 그러한 환경이 매우 일반적이라는 사실에 대한 응답일 뿐이며, 해결책의 필요성, 심지어 바람직한 부분으로 간주되지 않습니다.
가이드를 따라(또는 Spring Initializr을 사용) 한 후 로컬 컴퓨터에서 작동하지만 원격에서 작동하지 않는 WAR이 발생했습니다(Tomcat에서 실행).
오류 메시지는 없고 "Spring servlet initializer was found"라고 표시되어 있을 뿐 아무것도 하지 않았습니다.
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.
그리고.
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()
다른 일은 일어나지 않았다.스프링 부트가 실행되지 않았습니다.
서버를 Java 1.8로 컴파일하고 리모트컴퓨터는 Java 1.7로 컴파일했다고 합니다.
Java 1.7로 컴파일한 후 동작하기 시작했습니다.
<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>
의 ★★★★★★★★★★★★★★★★★.Application.java
.SpringBootServletInitializer
ex : :: ex :
public class Application extends SpringBootServletInitializer {}
Gradle을 사용하는 사용자를 위한 솔루션
을 「」에 추가합니다.build.gradle
apply plugin: 'war'
제공된 종속성을 Tomcat에 추가합니다.
dependencies {
// other dependencies
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
Public Class Application은 Spring Boot Servlet을 확장합니다.이니셜라이저 {}
Spring Boot Servlet을 확장하기만 하면 됩니다.이니셜라이저AWS/tomcat에서 동작합니다.
저도 같은 문제가 있었고 이 가이드를 따라 해결책을 찾습니다.나는 목표를 가지고 달린다.
클린 패키지
Thanq는 나에게 효과가 있었다.
TL;DR:
- 응용 프로그램 종속성에 동일한 Tomcat 버전이 있는지 확인하고 외부 Tomcat 설치
- Java 버전이 같다
Spring Boot 앱을 만들어 외부 Tomcat 서버와 호환되는 WAR을 생성하기 위해 모든 단계를 수행했습니다.는 내뱉었다SpringBootServletInitializer
뿐만 아니라.아직 이 작업을 수행하지 않은 경우 먼저 다른 답변 또는 공식 스프링 문서 - 기존 배포에서 설명한 대로 변경하십시오.
STS Embedded Tomcat 404 - Not Found 。, 「」라고 하는 것은 .catalina.bat run
사령부는 또한 "전개 완료"라는 정보를 제공했다.
14-Apr-2021 12:38:01.996 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
14-Apr-2021 12:38:01.996 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.5]
14-Apr-2021 12:38:02.023 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [C:\dev\apache-tomcat-10.0.5\webapps\server-test-1-0.0.1-SNAPSHOT.war]
14-Apr-2021 12:38:05.349 INFO [main] 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.
14-Apr-2021 12:38:05.436 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [C:\dev\apache-tomcat-10.0.5\webapps\server-test-1-0.0.1-SNAPSHOT.war] has finished in [3,413] ms
단, 출력Spring Boot」등)입니다.Initializing Spring DispatcherServlet 'dispatcherServlet'
는 이 카탈리나에 관한 것입니다.하지만 그것은 나타나지 않았다.
문제는 다음과 같습니다.maven 의존관계 폴더에 tomcat-embedded-core-9.0.44가 있습니다.그러나 스탠드아론 Tomcat 버전 10.x.xx를 컴퓨터에 설치했습니다.
컴퓨터에 Tomcat 버전 9.0.xx를 설치했는데 응용 프로그램은 정상적으로 작동했습니다.
Spring Boot 1.5.8로 2018-02-03을 업데이트합니다.풀어주다.
pom.xml에서는 Spring 플러그인이 빌드 중일 때 다음과 같이 패키지를 war로 변경하여 전쟁 파일임을 알려야 합니다.
<packaging>war</packaging>
또한 다음과 같이 추가하여 패키지 빌드 중에 내장된 Tomcat을 제외해야 합니다.
<!-- to deploy as a war in tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
실행 가능한 모든 예는 https://www.surasint.com/spring-boot-create-war-for-tomcat/에 있습니다.
Spring Boot 어플리케이션을 AWS에 도입하는 것이 목표라면 Boxfuse는 매우 쉬운 솔루션을 제공합니다.
필요한 것은 다음과 같습니다.
boxfuse run my-spring-boot-app-1.0.jar -env=prod
이것은 다음과 같습니다.
- 사용하시는 앱에 맞춘 최소한의 OS 이미지(일반 Linux 디스트리뷰션보다 약 100배 작음)를 퓨전할 수 있습니다.
- 안전한 온라인 저장소에 푸시
- 약 30초 만에 AMI로 변환
- 새로운 Elastic IP 또는 ELB 생성 및 구성
- 새 도메인 이름 할당
- 새 AMI를 기반으로 하나 이상의 인스턴스를 실행합니다.
모든 이미지는 몇 초 안에 생성되며 불변합니다.Virtual Box(dev) 및 AWS(test & prod)에서는 변경되지 않고 실행할 수 있습니다.
모든 업데이트는 다운타임이 없는 블루/그린 배포로 수행되며 명령어 1개만으로 자동 확장을 활성화할 수도 있습니다.
또한 Boxfuse는 Spring Boot 설정이 에 따라 보안 그룹과 ELB 헬스체크를 자동으로 설정하는 것을 이해하고 있습니다.
시작하기 위한 튜토리얼은 다음과 같습니다.https://boxfuse.com/getstarted/springboot
면책사항:저는 Boxfuse의 설립자이자 CEO입니다.
기존 앱을 변환하지 않고 새로운 앱을 만드는 경우 가장 쉽게 WAR 기반의 스프링 부트 애플리케이션을 만들 수 있는 방법은 Spring Initializr입니다.
애플리케이션을 자동 생성합니다.기본적으로는 Jar를 생성하지만 고급 옵션에서는 WAR을 생성하도록 선택할 수 있습니다.이 전쟁은 직접 실행할 수도 있다.
IntelliJ IDEA에서 직접 프로젝트를 작성하는 것도 간단합니다.
파일 → 새 프로젝트 → 봄 초기화
Spring Boot Servlet 확장 후 동작합니다.이니셜라이저 클래스
public class Application extends SpringBootServletInitializer {}
언급URL : https://stackoverflow.com/questions/27904594/spring-boot-war-deployed-to-tomcat
'source' 카테고리의 다른 글
IE11 HTTPS AJAX XMLHttpRequest:네트워크 오류 0x2eff, 오류 00002eff로 인해 작업을 완료할 수 없습니다. (0) | 2023.03.02 |
---|---|
Angular JS는 데스크톱 또는 모바일 기반의 다양한 뷰 (0) | 2023.03.02 |
Wordpress 탐색 모음의 사용자 지정 단축 코드 (0) | 2023.03.02 |
Angularjs의 다중 모듈 (0) | 2023.03.02 |
TypeScript 키워드 선언의 목적 (0) | 2023.03.02 |