[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 (간단 구조)

      app.jar ├─ META-INF/ │ └─ MANIFEST.MF (Main-Class, Class-Path 등) ├─ com/example/*.class └─ resources/...
    • WAR (표준 구조)

      app.war ├─ index.jsp ├─ css/, js/, images/ (정적 리소스) └─ WEB-INF/ ├─ web.xml (옵션: 서블릿 매핑, 필터 등) ├─ classes/ (컴파일된 .class 파일) │ └─ com/example/*.class └─ lib/ (종속 JAR들) └─ dependency1.jar
      • 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)

    • Maven

      • JAR: <packaging>jar</packaging> (기본)

      • WAR: <packaging>war</packaging>

      <!-- pom.xml: war 예시 --> <project> ... <packaging>war</packaging> ... </project>
    • Gradle

      • java 플러그인은 기본으로 JAR 생성.

      • war 플러그인 사용 시 WAR 생성:

      plugins { id 'java' id 'war' // WAR 생성 }
    • Spring Boot 특이점

      • Spring Boot는 spring-boot-starter-web과 함께 **내장 톰캣(embedded container)**으로 jar로도 웹 앱을 실행할 수 있도록 기본 구성(즉, 실행 가능한 fat JAR).

      • 전통적인 WAR로 만들 수도 있고(packaging: war), 서블릿 컨테이너에 배포할 수 있도록 SpringBootServletInitializer를 확장하면 됨.


    5) 실행/배포 예시 명령

    • JAR 실행

      java -jar myapp.jar
    • WAR 배포 (Tomcat 예시)

      • myapp.war를 Tomcat webapps/ 폴더에 복사 → Tomcat이 자동으로 배포(explode) 및 컨텍스트 생성.

      • 또는 Tomcat 관리자 페이지에서 업로드.


    6) ClassLoader & 라이브러리 위치 차이

    • JAR

      • 실행 JAR 내부(또는 classpath에 지정된 외부 JAR들)에 있는 클래스를 사용.

      • MANIFEST.MFClass-Path로 외부 JAR 참조 가능.

    • WAR

      • WEB-INF/classesWEB-INF/lib/*.jar가 웹 애플리케이션의 classpath.

      • 컨테이너는 보통 부모-자식 클래스로더(서버 클래스 로더와 웹앱 클래스 로더)를 사용 — 서버 레벨 라이브러리와 앱 레벨 라이브러리 충돌을 주의해야 함.


    7) 주요 차이점 정리 (표)

    항목JARWAR
    목적일반 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 장점

      • 표준적인 Java EE 웹 배포 방식. 여러 웹앱을 하나의 컨테이너에서 관리 가능.

      • 컨테이너가 제공하는 세션 관리, 리소스 설정(JNDI) 등 활용 가능.

    • WAR 단점

      • 컨테이너 종속성(배포 환경 통제 필요).

      • 라이브러리 충돌(서버와 앱 간) 관리 필요.

    언제 JAR?

    • 단일 독립 실행형 서비스, 마이크로서비스, Docker 컨테이너화, Spring Boot 같은 프레임워크 사용 시.

    언제 WAR?

    • 기존의 전통적 Java EE 웹 애플리케이션(서블릿/JSP)으로 여러 앱을 중앙 컨테이너로 관리할 때, 또는 호스팅 환경이 서블릿 컨테이너를 요구할 때.


    9) 실무 팁 / 주의사항

    1. Spring Boot: 기본은 실행 가능한 JAR(fat JAR) — 하지만 war로도 패키징 가능. 내장 톰캣과 외부 톰캣의 classloading 차이를 고려.

    2. 라이브러리 중복: WAR 배포 시 서버가 이미 제공하는 라이브러리와 충돌할 수 있음(예: Servlet API). provided 스코프로 처리해야 함.

    3. 디버깅: WAR를 Tomcat에 배포하면 WEB-INF/classes를 직접 확인하여 애플리케이션 파일 구조를 파악 가능(Exploded WAR).

    4. 실행 권한: java -jar로 실행되는 JAR은 OS 레벨 데몬으로 관리하려면 systemd나 서비스 매니저를 사용.

    5. 보안: 정적 리소스는 WAR 루트에 두되, WEB-INF 아래는 외부 접근 금지(민감 파일 보관 금지).


    10) 짧은 예제: 간단한 manifest로 실행 가능한 JAR 만들기

    1. Main.java

    package com.example; public class Main { public static void main(String[] args) { System.out.println("Hello from JAR"); } }
    1. 컴파일 및 JAR 생성:

    javac com/example/Main.java jar cfm myapp.jar MANIFEST.MF com/example/*.class
    1. MANIFEST.MF 예:

    Manifest-Version: 1.0 Main-Class: com.example.Main
    1. 실행:

    java -jar myapp.jar


     

    댓글

    이 블로그의 인기 게시물

    [8/9] 1184회 로또 당첨번호 추천!!

    [AWS] SCP, OU, Policy 사용하기 !!

    [AWS] AWS Activate 스타트업 $1,000 지원 성공

    [Gemini API] 구글 생성형 AI API 모델별 요금 및 청구 방식!!

    [8/2] 1183회 로또 당첨번호 추천!!

    [Shopizer E‑commerce] Shopizer란?

    [Vault] 온프레미스 구축 개요!!