1. 문제 상황
Eclipse에서 Spring Boot 프로젝트를 Export > WAR file 메뉴로 추출하여 상용 WAS(Tomcat, JEUS 등)에 배포할 때 다음과 같은 문제들이 발생할 수 있습니다.
- 멀티 모듈 프로젝트인 경우: 일반 Export 실행 시 자식 모듈(JAR)이나 의존성 라이브러리가 WEB-INF/lib에 정상적으로 포함되지 않아 ClassNotFoundException 발생.
- 외장 WAS 배포 시 (특히 JEUS): Local 톰캣 환경에서는 정상 기동되던 WAR 파일이 제우스(JEUS) 환경에 배포하면 클래스 충돌이나 서블릿 엔진 중복 문제로 구동 실패.
2. 원인 분석
① Export > WAR vs Maven Build 차이
- Eclipse Export: 프로젝트 워크스페이스 상태 기준으로 단순 압축하는 기능. 멀티 모듈 간의 의존성이나 pom.xml의 <scope> 설정을 정교하게 처리하지 못함.
- Maven Build (clean package): pom.xml 명세를 정확히 계산하여 필요한 라이브러리만 WEB-INF/lib에 올바르게 패키징함.
- run as > maven > maven buiild.. >goals : mvn clean package -DskipTests
② Tomcat에선 되는데 JEUS에선 왜 터졌을까?
- Spring Boot의 내장 톰캣: Spring Boot는 기본적으로 내장 톰캣(tomcat-embed-core.jar 등)을 포함합니다.
- Tomcat의 동작: 톰캣은 WAR 내부에 내장 톰캣 라이브러리가 섞여 있어도 자체 서버 라이브러리를 우선 적용(Parent-First)하여 대충 넘어가 줍니다.
- JEUS의 동작: 제우스는 기업용 WAS로 규격 검증이 엄격합니다. WAR 내부에 톰캣 서블릿 엔진 라이브러리가 포함되어 있으면 "WAS 내부에 다른 WAS 엔진이 들어왔다"고 판단하여 클래스 로딩 중 충돌(ClassCastException / 서블릿 중복)을 뿜으며 구동을 차단합니다.
3. 해결 방법 (Solution)
Step 1. pom.xml에 내장 톰캣 provided 설정 추가
외장 WAS(Tomcat/JEUS)가 서블릿 엔진을 제공하므로, WAR 패키징 시 내장 톰캣이 빠지도록 설정합니다.
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 외장 WAS 환경 배포 시 필수 설정 -->
<scope>provided</scope>
</dependency>
Step 2. 메인 클래스 수정 (SpringBootServletInitializer)
외장 WAS가 스프링 부트 앱의 시작점을 찾을 수 있도록 설정합니다.
Java
@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(YourMainApplication.class); // 메인 클래스명
}
public static void main(String[] args) {
SpringApplication.run(YourMainApplication.class, args);
}
}
Step 3. Eclipse 프로젝트 업데이트
설정 변경 후 반드시 Eclipse에서 Maven 업데이트를 수행합니다.
- 프로젝트 우클릭 ➔ Maven ➔ Update Project (단축키 Alt + F5)
Step 4. 올바른 WAR 빌드 실행
- 단일 모듈 프로젝트: pom.xml에 provided 설정이 완료되었다면 Export > WAR를 써도 무방합니다.
- 멀티 모듈 프로젝트: 웹 모듈 프로젝트 우클릭 ➔ Run As ➔ Maven build... ➔ Goals에 clean package 입력 후 빌드 (target/ 폴더 내 .war 사용).
💡 최종 검증
빌드된 .war 파일의 확장자를 .zip으로 변경하여 압축을 풀어봅니다.
WEB-INF/lib/ 경로 밑에 tomcat-embed-XXXX.jar 파일이 존재하지 않는다면 제우스(JEUS) 및 외장 WAS 배포 준비가 완벽히 끝난 것입니다!
📝 요약
- 멀티 모듈 프로젝트나 외장 WAS 배포 시에는 Eclipse 기본 Export보다 Maven Build (clean package)가 안전하다.
- 톰캣은 WAR 내부의 내장 톰캣 라이브러리를 눈감아주지만, 제우스(JEUS)는 엄격해서 구동 시 충돌 에러를 낸다.
- pom.xml에 spring-boot-starter-tomcat의 <scope>provided</scope>를 추가하여 내장 톰캣을 뺀 WAR를 생성해야 한다.
** export > war file 과 Maven Build의 차이를 알아야 배포시 오류를 줄일 수 있다 !