인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

charo님의 프로필 이미지
charo

작성한 질문수

Jenkins를 이용한 CI/CD Pipeline 구축

tomcat 배포 문제 war? jar?

해결된 질문

작성

·

240

1

안녕하세여 강의듣다가 현재 진행중인 프로젝트를 tomcat에 올려볼까 시도하고 있는데 잘안되서 여쭤봅니다. gradle 프로젝트이고 .jar -> .war으로 변환해서 올리고있는데 404에러가뜹니다.

 

maven 프로젝트로만 사용해야되는 건가요 ?

답변 1

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

Spring Boot 애플리케이션을 외부 Tomcat으로 기동하기시 위해서는 소스를 조금 수정하셔야 합니다.

  1. Application 파일을 아래와 같이 수정합니다.

@SpringBootApplication
public class MyRestfulServiceApplication extends SpringBootServletInitializer {

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

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

}
  1. pom.xml 파일에 Dependency를 확인합니다. (아래 내용이 없으면 추가합니다)

...
<packaging>war</packaging>
...
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
  </dependency>
</dependencies>

Maven에 대한 예시를 드렸는데, Gradle 도 유사하게 작업하시면 됩니다.

apply plugin: 'war' 
...
dependencies { 
  ... // war 패지키 파일 생성시 톰캣 라이브러리를 포함하지 않도록 추가 해야 합니다. 
  providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' 
}
  1. 패키징 된 war 파일을 Tomcat 폴더에 복사합니다.


    <TOMCAT_HOME>/webapps 폴더에 war 파일을 복사하고, 톰캣을 기동하면, war 파일의 이름으로 폴더가 생성되는데, API 호출 시, http://localhost:8080/<패키징된파일의폴더명>/<api> 이렇게 호출하시면 됩니다. 예를들어, embedded tomcat에서 http://localhost:8080/hello-world로 호출하셨다면, my-restful-service.war 파일의 경우 외장 톰캣에서는 http://localhost:8080/my-restful-service/hello-world 이런식으로 호출하시면 됩니다.

만약 위와 같은 방법으로 했을 때에도, 404 오류가 발생한다면, 작업하신 JDK 버전과 Tomcat의 버전이 서로 호환되는지 확인해 보셔야 할 것 같습니다. 만약 Java17 + Spring Boot 3 버전으로 테스트 중이라면, Tomcat9 버전이 아닌 Tomcat 10나 Tomcat 11 버전으로 테스트해 보시기 바랍니다.

감사합니다.

charo님의 프로필 이미지
charo
질문자

감사합니다. Tomcat 버전 10으로 바꾸니 잘 작동하네요! 감사합니다

charo님의 프로필 이미지
charo

작성한 질문수

질문하기