>  기사  >  Java  >  SpringBoot 프로젝트를 패키징하여 외부 Tomcat에 릴리스할 때 발생하는 문제를 해결하는 방법

SpringBoot 프로젝트를 패키징하여 외부 Tomcat에 릴리스할 때 발생하는 문제를 해결하는 방법

WBOY
WBOY앞으로
2023-05-10 17:49:141013검색

문제가 발생했을 때 상황에 대해 이야기해 보겠습니다.

스프링 부트 프레임워크를 사용하여 작은 웹 프로젝트를 작성하는 것은 처음 시도했는데 Intellij IDEA에서 정상적으로 시작하고 실행할 수 있었습니다. maven을 사용하여 설치를 실행하고 war 패키지를 생성한 후 로컬 tomcat에 게시합니다. 주요 예외 정보는 .....LifeCycleException입니다. 다양한 검색 끝에 답을 찾았습니다.

스프링 부트에는 Tomcat 컨테이너가 내장되어 있으므로 프로젝트를 jar 패키지로 패키징하여 게시할 수 있습니다. 그런데 스프링 부트 프로젝트를 tomcat에 게시할 수 있는 war 패키지 프로젝트로 패키징하려면 어떻게 해야 할까요?

1. war 패키지 프로젝트로 패키징해야 하므로 먼저 pom에서 패키징 유형을 수정해야 합니다. ;

2. 둘째, spring boot 웹 프로젝트에 tomcat 서버가 내장되어 있으므로, war 패키지를 tomcat 프로젝트에 게시하려면 spring boot에 포함된 tomcat 패키지의 종속성을 제외해야 합니다. 그렇지 않으면 다음 코드를 엽니다. 설명이면 충분합니다.

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
  <!--
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
  -->
</dependency>

내가 말하고 싶은 한 가지는 로컬 개발 중에 디버깅을 위해 여전히 spring boot를 사용하고 싶다면 다음 종속성을 추가하기만 하면 된다는 것입니다.

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-tomcat</artifactid>
  <scope>provided</scope>
</dependency>

3 게시할 spring boot용 웹 프로그램에 대한 입구입니다. jar 패키지는 주요 기능입니다. 이 패키지가 있는 클래스에는 @SpringBootApplication이라는 주석이 붙습니다. 그러나 war 패키지가 Tomcat에 게시된 경우 SpringBootServletInitializer 하위 클래스를 추가하고 해당 구성 메서드를 재정의하거나 SpringBootServletInitializer 하위 클래스에서 기본 기능이 있는 클래스를 직접 상속하고 해당 구성 메서드를 덮어써야 합니다. 코드 예시는 다음과 같습니다.

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
   
  @Override
  protected SpringApplicationBuilder configure(
      SpringApplicationBuilder application) {
    return application.sources(DemoApplication.class);
  }
 
   
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

위에서 스프링 부트 프로젝트용 war 패키지 패키징의 모든 단계가 완료되었으며, tomcat7 이상에 퍼블리시할 수 있습니다.

마지막이자 가장 중요한 점은 로컬 Tomcat 버전이 8.0 버전과 일치하지 않는 경우 springboot에 의해 자동으로 통합된다는 것입니다. 문제도 있을 수 있으며 해결책은 다음과 같습니다.

내 로컬 Tomcat 버전은 8.0.28이고 서버의 Tomcat은 7.0.69입니다. Tomcat 7.0.70을 로컬로 배포하고 동일한 오류를 보고했습니다. 문제가 Tomcat 버전과 관련이 있다는 것이 더 확실합니다. 여러 가지 방법으로 정보를 검색한 끝에 SpringBoot의 기본 서블릿 컨테이너는 Tomcat8을 기반으로 한다고 하는 외국인을 마침내 Stackoverflow에서 보았습니다.

준비된 war 패키지에서 Tomcat 관련 jar 패키지를 찾았는데 Tomcat8에서 온 것입니다. Tomcat8의 포함 패키지를 가져옵니다. Tomcat 7에서는 확실히 작동하지 않습니다.

SpringBoot 프로젝트를 패키징하여 외부 Tomcat에 릴리스할 때 발생하는 문제를 해결하는 방법

낮은 버전의 Tomcat을 지원하려면 Maven에서 Tomat 버전을 지정해야 합니다.

<properties>
  <tomcat.version>7.0.69</tomcat.version>
</properties>

그런 다음 이를 추가합니다. 종속성(실제로는 필요하지 않습니다. 공식 문서에 추가해야 합니다.) )

<dependency>
  <groupid>org.apache.tomcat</groupid>
  <artifactid>tomcat-juli</artifactid>
  <version>${tomcat.version}</version>
</dependency>

게다가 나중에 시도해 봤는데 문제가 없는 것으로 나타났습니다. war 패키지의 lib 디렉터리를 보니 과연 Tomcat7 패키지가 되었습니다

SpringBoot 프로젝트를 패키징하여 외부 Tomcat에 릴리스할 때 발생하는 문제를 해결하는 방법

그런데 아직도 좀 헷갈리는군요. Tomcat 버전을 변경하면 패키지로 만들 수 있나요? 이러한 제한은 SpringBoot 내부의 Servlet 컨테이너로 인해 발생하는데, 사용하면 안되나요? 많은 정보를 확인한 끝에 해결 방법을 찾았습니다!

아아아아

위 내용은 SpringBoot 프로젝트를 패키징하여 외부 Tomcat에 릴리스할 때 발생하는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제