[JAR vs WAR] JAR (Java ARchive) vs WAR (Web ARchive) 비교 분석!!
JAR (Java ARchive): 일반 Java 애플리케이션(라이브러리 또는 실행 가능한 애플리케이션)을 묶는 패키지. JVM에서 java -jar로 직접 실행 가능.
WAR (Web ARchive): 웹 애플리케이션(Servlet/JSP 기반)을 묶는 패키지. 서블릿 컨테이너(예: Tomcat, Jetty, WildFly 등)에 배포하여 실행.
1) 목적과 사용처
-
JAR
-
범용 Java 아카이브. 라이브러리(.class + 리소스)나 콘솔/데스크톱 애플리케이션을 배포할 때 사용.
-
실행 가능한 JAR은
Main-Class가 지정된MANIFEST.MF를 포함해java -jar app.jar로 실행.
-
-
WAR
-
웹 애플리케이션 전용 패키지. 서블릿, JSP, 필터, 리스너, 정적 리소스 등을 포함.
-
서블릿 컨테이너(애플리케이션 서버)에 배포(파일 복사 혹은 관리자 콘솔 업로드)하면 컨테이너가 WAR를 읽어 애플리케이션을 호스팅.
-
2) 내부 구조(대표적 디렉터리/파일)
-
JAR (간단 구조)
-
WAR (표준 구조)
-
WEB-INF는 외부에서 직접 접근 불가(보안). 웹 컨텍스트 루트는 WAR의 최상위.
-
3) 배포 방식 / 실행 방식
-
JAR
-
실행 가능한 JAR:
java -jar app.jar. -
라이브러리 JAR: 다른 애플리케이션의 classpath에 포함.
-
일반적으로 단일 JVM 프로세스로 실행.
-
-
WAR
-
Tomcat 같은 서블릿 컨테이너에 배포. 예:
webapps/myapp.war에 복사하면 자동 배포(exploded 또는 자동 압축 해제). -
컨테이너가 애플리케이션 컨텍스트(예:
http://host:8080/myapp) 설정, 서블릿 라이프사이클 관리.
-
4) 빌드 설정 예시 (Maven / Gradle)
-
-
JAR:
<packaging>jar</packaging>(기본) -
WAR:
<packaging>war</packaging>
-
-
-
java플러그인은 기본으로 JAR 생성. -
war플러그인 사용 시 WAR 생성:
-
-
Spring Boot 특이점
-
Spring Boot는
spring-boot-starter-web과 함께 **내장 톰캣(embedded container)**으로jar로도 웹 앱을 실행할 수 있도록 기본 구성(즉, 실행 가능한 fat JAR). -
전통적인 WAR로 만들 수도 있고(
packaging: war), 서블릿 컨테이너에 배포할 수 있도록SpringBootServletInitializer를 확장하면 됨.
-
5) 실행/배포 예시 명령
-
JAR 실행
-
WAR 배포 (Tomcat 예시)
-
myapp.war를 Tomcatwebapps/폴더에 복사 → Tomcat이 자동으로 배포(explode) 및 컨텍스트 생성. -
또는 Tomcat 관리자 페이지에서 업로드.
-
6) ClassLoader & 라이브러리 위치 차이
-
JAR
-
실행 JAR 내부(또는 classpath에 지정된 외부 JAR들)에 있는 클래스를 사용.
-
MANIFEST.MF의Class-Path로 외부 JAR 참조 가능.
-
-
WAR
-
WEB-INF/classes와WEB-INF/lib/*.jar가 웹 애플리케이션의 classpath. -
컨테이너는 보통 부모-자식 클래스로더(서버 클래스 로더와 웹앱 클래스 로더)를 사용 — 서버 레벨 라이브러리와 앱 레벨 라이브러리 충돌을 주의해야 함.
-
7) 주요 차이점 정리 (표)
| 항목 | JAR | WAR |
|---|---|---|
| 목적 | 일반 Java 애플리케이션 / 라이브러리 | 웹 애플리케이션 (Servlet/JSP 등) |
| 실행 방법 | java -jar (또는 classpath) | 서블릿 컨테이너(Tomcat 등)에 배포 |
| 표준 구조 | META-INF/, 클래스 파일 | WEB-INF/, WEB-INF/classes, WEB-INF/lib, 정적 리소스 |
| 배포 대상 | JVM 직접 실행 | 웹서버/서블릿 컨테이너 |
| 웹 관련 구성 | 별도 (프레임워크에 따라) | web.xml, 서블릿 매핑 등 표준 제공 |
| 사용 예 | 라이브러리, 콘솔 앱, Spring Boot 독립형 | 전통적인 Java 웹 앱 |
8) 장단점 & 선택 가이드
-
JAR 장점
-
단순 실행(종속성 포함된 fat/uber JAR이면 단일 파일로 배포 가능).
-
마이크로서비스/컨테이너화(Docker)시 편리.
-
-
JAR 단점
-
전통적인 웹 컨테이너 기능(다중 웹앱 호스팅, 관리 콘솔 등)이 필요하면 별도 설정 필요.
-
-
WAR 장점
-
WAR 단점
-
컨테이너 종속성(배포 환경 통제 필요).
-
라이브러리 충돌(서버와 앱 간) 관리 필요.
-
언제 JAR?
-
단일 독립 실행형 서비스, 마이크로서비스, Docker 컨테이너화, Spring Boot 같은 프레임워크 사용 시.
언제 WAR?
-
기존의 전통적 Java EE 웹 애플리케이션(서블릿/JSP)으로 여러 앱을 중앙 컨테이너로 관리할 때, 또는 호스팅 환경이 서블릿 컨테이너를 요구할 때.
9) 실무 팁 / 주의사항
-
Spring Boot: 기본은 실행 가능한 JAR(fat JAR) — 하지만
war로도 패키징 가능. 내장 톰캣과 외부 톰캣의 classloading 차이를 고려. -
라이브러리 중복: WAR 배포 시 서버가 이미 제공하는 라이브러리와 충돌할 수 있음(예: Servlet API).
provided스코프로 처리해야 함. -
디버깅: WAR를 Tomcat에 배포하면
WEB-INF/classes를 직접 확인하여 애플리케이션 파일 구조를 파악 가능(Exploded WAR). -
실행 권한:
java -jar로 실행되는 JAR은 OS 레벨 데몬으로 관리하려면 systemd나 서비스 매니저를 사용. -
보안: 정적 리소스는 WAR 루트에 두되,
WEB-INF아래는 외부 접근 금지(민감 파일 보관 금지).
10) 짧은 예제: 간단한 manifest로 실행 가능한 JAR 만들기
-
컴파일 및 JAR 생성:
-
MANIFEST.MF예:
-
실행:
댓글
댓글 쓰기