복잡한 Java 애플리케이션을 단일 압축 파일로 패키징하여 다른 환경 간에 이동시키거나, 다른 어플리케이션의 런타임 시 해당 어플리케이션에 연결하고자 할 때 유용하다. 또한, Java 애플리케이션 배포를 단순화하는 데 도움이 된다.
JAR, WAR, EAR는 모두 ZIP 파일 포맷을 기반으로 하기 때문에 ZIP 유틸리티를 사용하여 내용을 압축하거나 추출할 수 있다.
다만, 특수한 용도에 맞게 부가적인 규약이 정해져있다.
내부적으로 보면 EAR, JAR 및 WAR 파일은 모두 Java 애플리케이션을 구성하는 다양한 이미지, XML 파일, 속성 파일 및 Java 코드 조각이 포함된 단순한 ZIP 파일이다.
가장 큰 차이점은 서로 다른 환경을 대상으로 한다는 점이며,
내부 제한 사항 및 요구 사항에 있어 차이가 있다.
확장자 | EAR | WAR | JAR |
---|---|---|---|
대상 환경 | 엔터프라이즈 에디션의 자바 플랫폼(Java EE) | Java EE 웹 프로필 호환 애플리케이션 서버 | 표준 에디션의 자바 플랫폼(Java SE) |
요구 사항 | META-INF 폴더에 포함된 application.xml | WEB-INF 폴더에 포함된 web.xml | 없음 |
'JAVA ARchive'
JAR 파일에는 독립 실행형 Java 애플리케이션, 배포 가능한 Java 애플릿 또는 Java Runtime Environment 가 링크할 수 있는 Java 라이브러리 등 다양한 구성 요소가 모두 포함되어 있다.
: MANIFEST.MF* 파일 내 Main 클래스 위치(엔트리 포인트)가 지정되어 있고, 외부 의존성까지 포함하여 실제 프로그램으로 실행가능한 Jar
Skinny
코드 편집기에 문자 그대로 입력한 비트만 포함Thin
Skinny 항목과 애플리케이션의 직접적인 종속성(db 드라이버, 유틸리티 라이브러리 등)이 포함Hollow
Thin의 반대. 애플리케이션을 실행하는 데 필요한 비트만 포함되어 있으며 애플리케이션 자체는 포함되어 있지 않음. 추후에 애플리케이션을 배포할 수 있도록 사전 패키지된 "애플리케이션 서버"Fat/Uber
문자 그대로 직접 작성한 비트와 애플리케이션의 직접적인 종속성, 애플리케이션을 "자체적으로" 실행하는 데 필요한 비트가 포함됨
→ Executable Jar
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에 대한 메타데이터가 포함됨
java -jar xxx.jar
jar tf
명령어unzip -l
명령어
'Web Application Archive' 또는 'Web Application Resource'
웹 프로필(Web Profile)
전체 Java EE 플랫폼의 특정 하위 집합으로, 웹 애플리케이션 개발에 관련된 것들을 묶어서 정의함
- 목적은 개발자가 간단한 서블릿 컨테이너(예: Tomcat 또는 Jetty) 내에서 사용할 수 있는 보다 가벼운 애플리케이션을 만들 수 있도록 하는 것
- Apache TomEE 와 같은 제품으로 구현되거나 Eclipse Jetty 와 추가 기능을 사용하여 구현됨
실행할 때는 필요하지만, 웹 컨테이너를 배포하는데 필요없는 내장 톰캣과 같은 의존성은 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
'Enterprise Archive'
참고사이트
차이점
https://www.theserverside.com/feature/What-are-the-differences-between-EAR-JAR-and-WAR-files
https://hye0-log.tistory.com/27
https://velog.io/@gongmeda/JAR-vs-WAR?ref=codenary
https://simuing.tistory.com/269
https://stackoverflow.com/questions/5871053/difference-between-jar-and-war-in-java
https://dev.to/martygo/what-is-the-difference-between-a-jar-and-a-war-file-402a
bootJar, bootWar
https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html
Jar 종류
https://stackoverflow.com/questions/19150811/what-is-a-fat-jar
https://medium.com/@lalida_a/fat-jar-%E0%B8%99%E0%B9%89%E0%B8%AD%E0%B8%87%E0%B8%88%E0%B8%B2%E0%B8%A3%E0%B9%8C%E0%B8%AD%E0%B9%89%E0%B8%A7%E0%B8%99-6a7de3ad0864
https://www.theserverside.com/definition/JAR-file-Java-ARchive
외장 내장 톰캣 차이
https://thxwelchs.github.io/EmbeddedTomcat%EA%B3%BCTomcat%EC%9D%98%EC%B0%A8%EC%9D%B4/