source

Spring Boot 어플리케이션은 Tomcat에 도입했을 때 404를 제공하지만 임베디드 서버와 연동됩니다.

manysource 2023. 3. 21. 22:21

Spring Boot 어플리케이션은 Tomcat에 도입했을 때 404를 제공하지만 임베디드 서버와 연동됩니다.

Spring MVC에서 Web Content를 제공하는 방법에 따라 임베디드 Tomcat 인스턴스뿐만 아니라 독립형 Tomcat 8 서버에서도 실행할 수 있는 Spring Boot 웹 애플리케이션을 만듭니다.

응용 프로그램은 다음과 같이 실행되었을 때 예상대로 작동합니다.java -jar adminpage.war그리고 내가 방문했을 때 예상된 결과를 보게 된다.http://localhost:8080/table단, Tomcat 8 서버에 전개할 때는 (드롭을 통해)adminpage.warwebapps디렉토리)에 접속하면, 404 에러가 표시됩니다.https://myserver/adminpage/table.

catelina.log그리고.localhost.log파일에는 Tomcat 서버에서 도움이 되는 내용이 없습니다.

제가 잘못 구성한 부분을 알려주실 수 있나요?Spring Boot에서 RESTful 서비스를 도입할 때 이전과 같은 문제가 발생한 적은 없지만 웹 어플리케이션으로의 진출은 이번이 처음입니다.

내 응용 프로그램 파일:

src/main/java/com/.../Application.java

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

}

src/main/java/com/.../MainController.java

@Controller
public class MainController {

    @RequestMapping("/table")
    public String greeting(Model model) {
        model.addAttribute("name", "Fooballs");
        return "table";
    }
}

src/main/resources/templates/table.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>

pom.xml

<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.foo</groupId>
  <artifactId>adminpage</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.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>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>


  <build>
    <finalName>adminpage</finalName>

    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

내가 깜빡 잊고 내 것을 수정하지 않았었다.Application.java연장할 파일SpringBootServletInitializer를 덮어씁니다.configure방법.

수정된 파일:

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

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
      return builder.sources(Application.class);
  }
}

제 실수를 지적해 주신 것에 대한 https://mtdevuk.com/2015/07/16/how-to-make-a-spring-boot-jar-into-a-war-to-deploy-on-tomcat/에 대한 힌트입니다.

자세한 내용은 Spring Boot Official 문서에서 전개 가능한 전쟁 파일 작성.

2021년 8월 현재 Tomcat 10 서버에서 이 문제가 발생하는 경우 아래 게시물에서 봄 부팅이 Tomcat 10에서 작동하지 않음을 읽어 보십시오. https://github.com/spring-projects/spring-boot/issues/22414

이 문제에 직면하여 이전 버전으로 전환하여 문제를 해결했습니다.

IntelliJ 커뮤니티 에디션에서 스프린트 부트 사용 중 동일한 문제가 발생한 경우.메인 클래스를 메인 패키지(com.xyx)에 넣으면 됩니다.com 내부에 작성된 서브 패키지에 넣지 마십시오.xyx.

Tomcat을 버전 10에서9로 다운그레이드 하면 효과가 있었습니다.업데이트 2022년 1월, Tomcat 10은 여전히 스프링 부트를 지원하지 않는 것 같습니다.여기 Dipu가 언급했듯이, https://stackoverflow.com/a/68917349/13294956

@RestController @RequestMapping(값 = "/")과 같이 컨트롤러 주석에서 경로를 추가합니다.

Tomcat 10에서는 스프링 부트가 작동하지 않았습니다.9가지 버전으로 바꿨는데 작동했어요.

또 다른 SO 질문에 대한 다이어트 담당자의 답변을 인용합니다.

전쟁 파일 이름은 priz-0.5.war입니다.따라서 컨텍스트 이름도 priz-0.5 입니다.예를 들어 http://localhost:8080/priz-0.5를 호출해야 합니다.

http://localhost:8080/ 와 같이 호출하려면 war-File 이름을 ROOT.war로 변경해 주세요.

같은 문제가 있었지만, Spring Boot Configuration에서는 문제가 없었습니다.404가 있는 이유를 이제야 알았습니다.

build->plugin의 maven-dependency-plugin을 pom.xml에서 삭제했습니다.

<!--
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.3.0</version>
        </plugin>
-->

이 삭제로 Tomcat9에서 war 파일을 성공적으로 테스트하고 mvnw를 통해 테스트할 수 있게 되었습니다.

이것이 누군가에게 도움이 되기를

저도 같은 문제가 있었는데 알고 보니 서버가 Java 8을 실행하고 있을 때 Java 11용 앱을 컴파일했습니다.일단 자바 11로 업그레이드하면 정상적으로 동작합니다.톰캣츠 로그에는 그 문제를 나타내는 것이 전혀 없었기 때문에 그것은 까다로웠습니다.

언급URL : https://stackoverflow.com/questions/39567434/spring-boot-application-gives-404-when-deployed-to-tomcat-but-works-with-embedde