JAR vs WAR

Gongmeda·2023년 2월 5일
2
post-thumbnail

JAR이란?

JAR은 'Java Archive' 를 뜻하는 Java 클래스 및 라이브러리 패키징을 위한 표준 형식입니다.

.jar 확장자를 사용하며, 하나의 파일에 Java 클래스, 리소스, 메타 정보 등을 포함할 수 있습니다.

gradle 기준 bootJar 명령어로 생성할 수 있습니다.

java -jar 파일명.jar

JRE(JAVA Runtime Environment)만 설치되어 있다면 위 명령어로 실행할 수 있습니다.

구조

.jar 파일은 기본적으로 컴파일된 프로젝트의 클래스 파일과 리소스를 포함하는 압축 파일입니다.

따라서, 확장자를 .zip 으로 바꾸고 압축을 풀면 내부 구조를 확인해볼 수 있습니다.

example.jar
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-BOOT-INF
    +-classes
    |  +-mycompany
    |     +-project
    |        +-YourClasses.class
    +-lib
       +-dependency1.jar
       +-dependency2.jar

Spring Boot로 빌드된 JAR 파일에는 크게 세 가지 폴더가 존재합니다.

  1. BOOT-INF: 애플리케이션 클래스(개발자가 작성한 클래스)와 의존성 JAR 파일들이 포함되어 있습니다. classpath.idx , layers.idx 두 파일도 존재하는데, 각각 JAR 파일이 classpath 에 추가되어야 하는 순서와 Docker/OCI 이미지 생성을 위한 논리 레이어 정보를 제공합니다.
  2. META-INF: MANIFEST.MF 파일을 포함하는 폴더로, 해당 파일에는 프로젝트에 관련된 메타 데이터가 포함되어 있습니다.
  3. org: Spring Boot Loader 클래스들이 존재합니다.

JAR을 실행하는 내부 과정은 다음과 같습니다.

  1. org.springframework.boot.loader.jar.JarFile 가 JAR 파일들을 인식하고 로드합니다.
  2. org.springframework.boot.loader.Launcher 을 실행합니다. 이는 사실 MANIFEST.MF 에 정의된 Main-Class 로 JAR의 경우 org.springframework.boot.loader.JarLauncher 입니다.
  3. MANIFEST.MF 에 정의된 Start-Class 의 Main 메소드를 실행합니다.

WAR이란?

WAR은 'Web Application Archive' 또는 'Web Application Resource' 를 뜻하는 Servlet/JSP 컨테이너 위에 배포할 수 있는 웹 애플리케이션을 패키징할 수 있는 형식입니다.

.war 확장자를 사용하며, Java 클래스, JSP 파일, HTML 파일, 기타 정적 리소스와 웹서버가 애플리케이션을 어떻게 구성할지에 대한 명세인 web.xml 파일을 포함하고 있습니다.

프로젝트 build.gradle 파일의 plugins에 WAR 관련 설정을 추가하면 bootWar 명령어를 사용할 수 있게 되고 이를 실행하여 생성할 수 있습니다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'war' // 추가
}

WAR 파일을 실행하기 위해서는 Tomcat , Jetty 와 같은 Java 기반의 웹서버를 별도로 구성하고, 그 위에 올려서 실행해야 합니다.

구조

JAR와 마찬가지로 .zip 으로 확장자를 바꾸고 압축을 풀면 내부 구조를 살펴볼 수 있습니다.

example.war
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-WEB-INF
    +-classes
    |  +-com
    |     +-mycompany
    |        +-project
    |           +-YourClasses.class
    +-lib
    |  +-dependency1.jar
    |  +-dependency2.jar
    +-lib-provided
       +-servlet-api.jar
       +-dependency3.jar

여기서 알 수 있는 차이점은 다음과 같습니다.

  • BOOT-INF 폴더가 WEB-INF 로 대체되었고, 내부 디렉토리 형식이 조금 다릅니다.
  • MANIFEST.MF 에 정의되어 있는 Main-ClassWarLauncher 로 바뀌었습니다.

WAR은 WEB-INFMETA-INF 디렉토리가 강제되는데 반해 JAR은 자유롭습니다.

결국 대부분의 내용은 동일하고 패키징 형식만 다르다고 볼 수 있습니다.

참조

profile
백엔드 깎는 장인

0개의 댓글