Spring

War와 Jar

minturtle 2024. 11. 15. 15:02
반응형

개요

  • Spring 또는 Java로 웹 어플리케이션을 만들게 되면 .war 파일과 .jar 이 생성됩니다. 이번에는 이 파일들에 대해 알아보고자 합니다.

Jar 파일

  • jar 파일은 java archive의 약자로, JVM위에서 실행되거나 라이브러리로 사용할 수 있도록 관련 된 자바 클래스 파일을 압축한 파일입니다.
  • 실행하는 경우 main() 메서드가 필요하며, MANIFEST.MF에 메인 메서드의 클래스를 지정해 주어야 합니다.
  • jar 파일을 압축 해제 했을때 포함하는 파일은 다음과 같습니다.
    • META-INF
      • MANIFEST.MF : jar 파일을 시작할 때 실행되는 main 메서드와 기타 메타 정보를 포함한 파일
    • classes : 사용자가 작성한 Java 코드(ByteCode의 형태)
  • jar 파일은 기본적으로 Jar파일 내부에 jar파일을 포함할 수 없기 때문에, 라이브러리를 내장할 수 없습니다.

FatJar

  • 위의 jar파일 내에 라이브러리 jar파일을 실행할 수 없는 문제를 해결하기 위해 fat jar라는 기능을 사용합니다.
  • fat jar는 라이브러리의 jar파일을 해제해 생긴 class 파일들을 새로 만드는 jar파일에 포함시키는 방법입니다.
  • 그러나 FatJar도 단점이 있는데, 아래와 같습니다.
    • 어떤 라이브러리를 사용하는지 확인하기 어렵습니다.
    • 파일명 중복을 해결하기 어렵습니다.
    • META-INF에서 등록한 초기화 함수가 여러개 존재한다면, java 실행시 임의의 하나의 파일만 등록되어 초기화 됩니다.

Executable Jar

  • Spring Boot에서는 BOOT-INF 폴더가 존재합니다. 이 폴더에는 classes(개발자가 작성한 코드의 바이트 코드)와 lib 폴더에 라이브러리 jar파일(?!)가 존재합니다.
  • jar파일안에는 jar가 존재하지 못한다고 했는데, Spring Boot는 어떻게 해결하는 것일까요?
  • 스프링 부트에서는 Executable jar 이라는 특별한 구조의 jar를 만들어서, jar 파일 안에 jar를 포함하는 것이 가능하도록 만들어버렸습니다.
  • executable jar은 아래의 구조를 가집니다.
    • META-INF
      • MANIFEST.MF : 메타정보와 메인 클래스 정보
    • org/springframework/boot/loader
      • JarLauncher.class : Spring Boot 앱을 실행하는 메인 메서드가 있는 클래스
    • BOOT-INF:
      • classes : 개발자가 작성한 class 파일
      • lib : 외부 라이브러리(jar 파일로 존재)
      • classpath.idx : 외부 라이브러리 모음
      • layer.idx : 스프링 부트 구조 정보

war 파일

  • war파일은 Web Application Archive의 약자로, WAS에 배포할 때 사용되는 파일입니다.
  • 이는 자바 클래스 파일, HTML등의 웹 서버 구동에 필요한 자원을 한데 모아 놓고 압축되어 제공됩니다.
  • 이러한 파일은 압축된 상태로 전달되며, 압축 해제했을 때 아래의 파일들이 존재하게 됩니다.
    • WEB-INF :
      • classes : 사용자가 정의한 실행 클래스
      • lib : 라이브러리 모음
    • 정적 파일(HTML, CSS, JS 파일 등)

추가 내용

  • jar와 war는 jar 명령어를 사용해 해제할 수 있으며, 이는 JDK에 내장되어 있습니다.

출처

  • [Spring boot 배포 War 만들기 (War 파일이란?)]
  • [스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런]
반응형