JAR, WAR, EAR 비교 (Executable Jar, Fat Jar, bootWar)

sua_ahn·2023년 11월 28일
1

Java

목록 보기
15/15

JAR, WAR, EAR

사용 이유

복잡한 Java 애플리케이션을 단일 압축 파일로 패키징하여 다른 환경 간에 이동시키거나, 다른 어플리케이션의 런타임 시 해당 어플리케이션에 연결하고자 할 때 유용하다. 또한, Java 애플리케이션 배포를 단순화하는 데 도움이 된다.

ZIP 과의 비교

JAR, WAR, EAR는 모두 ZIP 파일 포맷을 기반으로 하기 때문에 ZIP 유틸리티를 사용하여 내용을 압축하거나 추출할 수 있다.
다만, 특수한 용도에 맞게 부가적인 규약이 정해져있다.

비교

공통점

내부적으로 보면 EAR, JAR 및 WAR 파일은 모두 Java 애플리케이션을 구성하는 다양한 이미지, XML 파일, 속성 파일 및 Java 코드 조각이 포함된 단순한 ZIP 파일이다.

차이점

가장 큰 차이점은 서로 다른 환경을 대상으로 한다는 점이며,
내부 제한 사항 및 요구 사항에 있어 차이가 있다.

확장자EARWARJAR
대상 환경엔터프라이즈 에디션의 자바 플랫폼(Java EE)Java EE 웹 프로필 호환 애플리케이션 서버표준 에디션의 자바 플랫폼(Java SE)
요구 사항META-INF 폴더에 포함된 application.xmlWEB-INF 폴더에 포함된 web.xml없음

 


JAR

'JAVA ARchive'
JAR 파일에는 독립 실행형 Java 애플리케이션, 배포 가능한 Java 애플릿 또는 Java Runtime Environment 가 링크할 수 있는 Java 라이브러리 등 다양한 구성 요소가 모두 포함되어 있다.

실행 가능한 Jar (Executable Jar)

: MANIFEST.MF* 파일 내 Main 클래스 위치(엔트리 포인트)가 지정되어 있고, 외부 의존성까지 포함하여 실제 프로그램으로 실행가능한 Jar

Skinny
코드 편집기에 문자 그대로 입력한 비트만 포함

Thin
Skinny 항목과 애플리케이션의 직접적인 종속성(db 드라이버, 유틸리티 라이브러리 등)이 포함

Hollow
Thin의 반대. 애플리케이션을 실행하는 데 필요한 비트만 포함되어 있으며 애플리케이션 자체는 포함되어 있지 않음. 추후에 애플리케이션을 배포할 수 있도록 사전 패키지된 "애플리케이션 서버"

Fat/Uber
문자 그대로 직접 작성한 비트와 애플리케이션의 직접적인 종속성, 애플리케이션을 "자체적으로" 실행하는 데 필요한 비트가 포함됨
→ Executable Jar

bootJar

war는 jar를 포함할 수 있지만 jar는 다른 jar를 포함하지 못한다. 내장톰캣과 같이 실행에 필요한 외부 jar를 포함하려면 특수한 방법이 필요하다.

이전에는 Fat Jar 방식으로 모든 jar를 class파일로 푼 뒤, 다시 하나의 jar로 만드는 방식도 사용되었다. 그러나 jar간 경계가 사라지고 파일이름이 중복되는 문제가 발생하여 적합하지 않다.

이를 해결하기 위해 SpringBoot는 SpringBoot만의 실행가능한 JAR 구조를 갖는다. Application class는 중첩된 BOOT-INF/classes 디렉토리에 위치하며, Dependency는 중첩된 BOOT-INF/lib 디렉토리에 위치해야 한다.

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-starter-web 이나 spring-boot-starter-tomcat 의존성을 추가함으로써 내장 톰캣(tomcat-embed-core)을 사용할 수 있다.

톰캣이 내장된 애플리케이션은 톰캣 구성에 대한 부분의 관심사를 분리하여 개발자에게 애플리케이션단의 코드 작성에 더 집중할 수 있게 해준다.

META-INF/MANIFEST.MF 매니페스트 파일
: 코드 버전, 코드의 주요 작성자, 코드를 유지관리하는 조직의 이름과 같은 속성을 포함하여 JAR에 대한 메타데이터가 포함됨

실행과정

  1. java -jar xxx.jar
  2. org.springframework.boot.loader.jar.JarFile 이 JAR 파일을 인식하고 로드
  3. MANIFEST.MF 인식
  4. Main-Class인 org.springframework.boot.loader.JarLauncher.main() 실행
  5. BOOT-INF/classes/ 인식
  6. BOOT-INF/lib/ 인식
  7. BootApplication.main() 실행

 

JAR 여는 방법

압축 열기

  • jar tf 명령어
  • .zip 으로 확장자 변경 -> 압축 해제 도구 이용
  • unzip -l 명령어

내부 파일내용 확인

  • 여러 GUI 도구 사용 (ex. JD-GUI)

 


WAR

'Web Application Archive' 또는 'Web Application Resource'

특징

  • 웹 애플리케이션 리소스를 위한 표준 패키지
    → JSP(JavaServer Pages) 가 동작함
  • bootWar 외엔 외장 톰캣으로만 실행 가능

요구사항

  • Java EE 웹 프로필 호환 애플리케이션 서버 필요
  • WEB-INF 폴더에 포함된 web.xml 파일(배포 설명자)이 필요
    → Spring Framework’s Servlet 3.0 부터 web.xml 대신 WebApplicationInitializer 인터페이스를 구현하여 배포 가능
    (Apache Tomcat 7.0부터 지원)

웹 프로필(Web Profile)
전체 Java EE 플랫폼의 특정 하위 집합으로, 웹 애플리케이션 개발에 관련된 것들을 묶어서 정의함

  • 목적은 개발자가 간단한 서블릿 컨테이너(예: Tomcat 또는 Jetty) 내에서 사용할 수 있는 보다 가벼운 애플리케이션을 만들 수 있도록 하는 것
  • Apache TomEE 와 같은 제품으로 구현되거나 Eclipse Jetty 와 추가 기능을 사용하여 구현됨

 

bootWar

실행할 때는 필요하지만, 웹 컨테이너를 배포하는데 필요없는 내장 톰캣과 같은 의존성은 WEB-INF/lib-provided 안에 위치한다.

3가지 런처
: JarLauncher, WarLauncher, PropertiesLauncher
→ 목표는 nestsed jar 파일을 읽어들이는 것
→ Launcher는 Main-Class에 설정해주어야 함 (Maven 플러그인이 자동으로 해줌)

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

 


EAR

'Enterprise Archive'

특징

  • WAR 파일과 JAR 파일을 포함하는 상위 집합
  • Java EE 기반 엔터프라이즈 애플리케이션의 경우 .ear 확장자를 사용

요구사항

  • Java EE(Java Platform, Enterprise Edition) 또는 EE(Jakarta Enterprise Edition) 호환 애플리케이션 서버 ( 예: WebSphere 또는 JBoss )가 필요
  • META-INF라는 폴더에 포함된 application.xml 파일 필요

 

 


참고사이트

profile
해보자구

0개의 댓글