맨위로가기

JAR (파일 포맷)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

JAR(Java Archive) 파일은 자바 애플리케이션을 효율적으로 배포하기 위해 설계된 파일 형식으로, 자바 클래스와 관련 리소스를 단일 파일로 묶어 압축한 형태이다. JAR 파일은 매니페스트 파일을 선택적으로 포함하여 JAR 파일 사용 방식을 기술할 수 있으며, 디지털 서명을 통해 보안을 강화하고, 실행 가능한 JAR 파일을 만들 수 있다. JAR 파일은 ZIP 파일을 해제하는 소프트웨어나 자바 개발 키트의 `jar` 명령을 사용하여 압축을 해제할 수 있다. JAR 파일을 기반으로 WAR, RAR, EAR, APK, AAR 등 다양한 파일 형식이 파생되었다.

더 읽어볼만한 페이지

  • 아카이브 포맷 - ARJ
    ARJ는 다양한 소프트웨어 유틸리티에서 압축 해제가 가능한 파일 포맷으로, macOS에서는 독립 실행형 유틸리티를 통해 압축을 해제할 수 있다.
  • 아카이브 포맷 - 7z
    7z는 LZMA 알고리즘 기반의 높은 압축률과 다양한 기능을 제공하며 오픈 아키텍처를 채택하여 여러 압축 알고리즘, 변환 방식, 암호화 방식을 지원하는 파일 압축 포맷이다.
  • 자바 플랫폼 - 블루레이
    블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다.
  • 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
JAR (파일 포맷) - [IT 관련 정보]에 관한 문서
파일 정보
일반 정보
파일 확장자.jar
파일 종류파일 아카이브
데이터 압축
기반 형식ZIP
개발넷스케이프
썬 마이크로시스템즈
오라클

2. 설계

JAR 파일은 자바 런타임이 애플리케이션을 효율적으로 배포(디플로이)할 수 있도록 설계되었다. JAR 파일은 자바 애플리케이션을 구성하는 클래스와 관련 리소스들을 단일 파일로 묶고 압축하여, 한 번의 요청으로 전체 애플리케이션을 다운로드할 수 있게 해준다.

JAR 파일은 `META-INF/MANIFEST.MF` 경로에 매니페스트 파일을 포함할 수 있다. 매니페스트 파일에는 JAR 파일 사용 방법을 설명하는 엔트리 정보가 들어 있다. 예를 들어 클래스패스 엔트리를 사용하여 해당 JAR 파일과 함께 로드할 다른 JAR 파일을 지정할 수 있다.[17][18]

C 언어나 C++(C++) 등으로 작성된 머신 네이티브 프로그램이나 라이브러리도 아카이브로 묶어 배포되지만, 압축을 풀고 설치해야 한다. 반면 Java 실행 환경 (Java Runtime Environment: JRE)에 포함된 Java 표준 도구는 JAR을 직접 처리할 수 있어, 사용자가 명시적으로 JAR 압축을 해제할 필요가 없다.

JAR 파일은 하위 호환성은 있지만, 상위 호환성은 보장되지 않는다. 이전 버전의 JDK로 생성한 JAR 파일은 새로운 버전의 JDK나 JRE에서 사용할 수 있지만, 반대로 새로운 JDK로 생성한 JAR 파일을 이전 버전의 JDK나 JRE에서 사용해서는 안 된다.[19]

3. 압축 해제

JAR 파일의 압축을 해제하려면 ZIP 파일을 해제하는 표준 소프트웨어를 사용하거나 자바 개발 키트에 포함된 `jar` 명령어를 사용하면 된다.: `jar -xf foo.jar`

파일 내용은 ZIP 형식을 지원하는 모든 압축 해제 소프트웨어나 자바 개발 키트에서 제공하는 `jar` 명령줄 유틸리티를 사용하여 추출할 수 있다.

일반적으로 C 언어나 C++(C++) 등으로 작성된 머신 네이티브 프로그램이나 라이브러리(네이티브 코드)도 아카이브로 묶여 배포되는 경우가 많지만, 이들은 압축을 풀고 설치해야 한다. 이에 반해 Java 실행 환경 (Java Runtime Environment: JRE) 등에 포함된 Java의 표준 도구는 JAR을 직접 처리할 수 있으므로 사용자가 명시적으로 JAR을 압축 해제할 필요가 없다.

4. 보안

개발자들은 JAR 파일에 디지털 서명을 할 수 있다. 이 경우 서명 정보는 내재된 매니페스트 파일의 일부가 된다. JAR 자체에 서명되는 것이 아니라, 압축 파일 안의 모든 파일들이 체크섬으로 나열되고, 이 체크섬을 통해 서명이 이루어진다. 여러 개의 엔트리들은 각기 서명함으로써 JAR 파일 자체를 변경하여 JAR 파일을 서명할 수 있지만 서명된 파일들은 그 자체로 유효한 상태로 남아있다. 서명된 JAR 파일들을 자바 런타임이 로드할 때 서명이 유효한지 확인하고 서명이 일치하지 않는 클래스들은 로드를 거부할 수 있다.

JAR 파일 안의 내용은 리버스 엔지니어링을 어렵게 하기 위해 난독화되기도 한다. 또한 '봉인된' 패키지를 지원할 수 있으며, 여기서 클래스 로더는 모든 Java 클래스가 동일한 개체에 의해 서명된 경우에만 동일한 패키지로 로드하도록 허용한다. 이는 악성 코드가 기존 패키지에 삽입되어 패키지 범위의 클래스 및 데이터에 접근하는 것을 방지한다.

JAR에는 전자 서명을 할 수도 있다. 이를 통해 Java 애플릿 등의 Java 애플리케이션을 실행할 때, 사용자가 해당 서명을 신뢰하는 경우에 한하여 샌드박스 모델에서는 불가능했던 사용자의 로컬 환경에 있는 대상 리소스에 접근하는 것이 가능해진다.

5. 실행 가능한 JAR 파일

실행 가능한 자바 프로그램은 프로그램이 사용하는 다른 라이브러리와 함께 JAR 파일로 압축될 수 있다. JAR 파일이 실행 가능하려면 파일 안에 포함된 매니페스트 파일에 엔트리 포인트의 클래스 이름이 `Main-Class: myPrograms.MyClass` 형식으로 기술되어야 하며, 명시적으로 클래스패스 정보가 기술되어 있어야 한다. (이때 -cp 인수는 무시된다) 운영체제에 따라서는 JAR 파일의 아이콘을 직접 클릭해서 실행가능하기도 하다.[26] JAR 파일을 커맨드 라인에서 실행시키기 위해서는 `java -jar foo.jar`라고 입력한다.

대부분의 플랫폼에서 네이티브 실행기를 만들 수 있다. 예를 들어, 윈도우 EXE 파일을 선호하는 마이크로소프트 윈도우 사용자는 JSmooth, Launch4J, WinRun4J 또는 Nullsoft Scriptable Install System과 같은 도구를 사용하여 단일 JAR 파일을 실행 파일로 래핑할 수 있다.

6. 매니페스트 파일

JAR 파일은 `META-INF/MANIFEST.MF` 경로에 매니페스트 파일을 선택적으로 포함할 수 있다. 매니페스트 파일에는 JAR 파일의 사용 방법을 기술하는 엔트리 정보가 담겨 있다. 예를 들어, 클래스패스 엔트리를 사용하여 해당 JAR 파일과 함께 로드할 다른 JAR 파일들을 지정할 수 있다.[26]

매니페스트 파일은 JAR 파일에 포함된 메타데이터 파일이다.[6][7] 확장 및 패키지 관련 데이터를 정의하며, 섹션으로 구성된 이름-값 쌍을 포함한다. JAR 파일을 실행 파일로 사용하려는 경우, 매니페스트 파일은 애플리케이션의 메인 클래스를 지정한다. 매니페스트 파일의 이름은 `MANIFEST.MF`이며, 압축된 아카이브의 첫 번째 항목이어야 한다.

6. 1. 매니페스트 파일 사양

JAR 파일 안에 포함되어 있는 매니페스트 파일은 메타데이터 정보를 포함하고 있다.[27][28] 이 메타데이터 정보에는 확장 정보 및 패키지 관련 데이터가 기술되어 있으며, 섹션 형식으로 구성된 키-값 쌍 형태의 문자열이다. JAR이 실행 가능하도록 하기 위해서는, 매니페스트 파일에 애플리케이션의 메인 클래스 이름이 기술되어 있어야 한다. 매니페스트 파일의 명칭은 `MANIFEST.MF`이며, 이 파일이 포함되어 있는 디렉토리는 압축된 파일의 내용물 가운데 가장 첫 번째 위치에 배치되어야 한다.

매니페스트는 표준 위치인 `META-INF/MANIFEST.MF`에 나타난다.[8] 아카이브에는 하나의 매니페스트 파일만 존재할 수 있으며, 해당 위치에 있어야 한다.

자바 개발 키트 버전 1.0으로 생성된 JAR 파일의 매니페스트 파일 내용은 다음과 같다.

```text

Manifest-Version: 1.0

```

이름과 값은 콜론(:)으로 구분된다. 기본 매니페스트는 매니페스트 사양의 버전 1.0을 준수함을 보여준다.

매니페스트는 아카이브에 패키지된 다른 파일에 대한 정보를 포함할 수 있다. 매니페스트 내용은 JAR 파일의 의도된 사용에 따라 다르다. 기본 매니페스트 파일은 다른 파일에 대해 어떤 정보를 기록해야 하는지에 대한 가정을 하지 않으므로, 한 줄만 자체에 대한 데이터를 포함한다. UTF-8로 인코딩되어야 한다.

6. 2. 특수 목적의 매니페스트 헤더

JAR 파일에 포함된 매니페스트 파일은 메타데이터 정보를 담고 있다.[27][28] 이 메타데이터에는 확장 정보 및 패키지 관련 데이터가 섹션 형식의 키-값 쌍 형태 문자열로 기술되어 있다.

JAR 파일을 실행 가능하게 하려면 매니페스트 파일에 애플리케이션의 메인 클래스 이름을 명시해야 한다. 매니페스트 파일의 이름은 `MANIFEST.MF`이며, 압축 파일 내용물 중 가장 첫 번째 위치에 배치되어야 한다.

대부분의 JAR 파일은 단순한 아카이빙 및 압축 이상의 기능을 수행하기 위해 매니페스트 파일에 특수한 정보를 필요로 한다.

6. 3. 기능

JAR 파일은 실행 가능한 자바 프로그램을 만들거나, 패키지 버전 관리 및 봉인, 멀티 릴리스, 종속성 관리 등 다양한 기능을 제공한다. 매니페스트 파일(`MANIFEST.MF`)은 이러한 기능을 정의하는 데 사용되며, 키-값 쌍 형태의 속성들로 구성된다.[27][28]

6. 3. 1. 애플리케이션

실행 가능한 자바 프로그램은, 프로그램이 사용하는 다른 라이브러리와 함께 JAR 파일로 압축될 수 있다. JAR 파일이 실행 가능하려면 파일 안에 포함된 메니페스트 파일에 엔트리 포인트의 클래스 이름이 `Main-Class: myPrograms.MyClass` 형식으로 기술되어야 하며, 명시적으로 클래스패스 정보가 기술되어 있어야 한다.(이때 -cp 인수는 무시된다) 운영체제에 따라서는 JAR 파일의 아이콘을 직접 클릭해서 실행가능하기도 하다.[26] JAR 파일을 커맨드 라인에서 실행시키기 위해서는 `java -jar foo.jar`라고 입력한다.

JAR 파일 안에 포함되어 있는 매니페스트 파일은, 메타데이터 정보를 포함하고 있다.[27][28] 이 메타데이터 정보에는 확장 정보 및 패키지 관련 데이터가 기술되어 있으며, 섹션 형식으로 구성된 키-값 쌍 형태의 문자열이다.

JAR이 실행 가능하도록 하기 위해서는, 메니페스트 파일에, 애플리케이션의 메인 클래스의 이름이 기술되어 있어야 한다. 메니페스트 파일의 명칭은 `MANIFEST.MF`이며, 이 파일이 포함되어 있는 디렉토리는, 압축된 파일의 내용물 가운데 가장 첫번째 위치에 배치되어야 한다.

만약 애플리케이션이 JAR 파일에 포함되어 있다면, 자바 가상 머신은 애플리케이션의 진입점을 알아야 한다. 진입점은 `public static void main(String[] args)` 메서드를 가진 모든 클래스이다. 이 정보는 매니페스트의 Main-Class 헤더에 제공되며, 일반적인 형식은 다음과 같다.

Main-Class: com.example.MyClassName

이 예에서 `com.example.MyClassName.main()`은 애플리케이션 실행 시 실행된다.

6. 3. 2. 패키지 봉인

JAR 파일 내의 패키지는 선택적으로 봉인(밀봉)할 수 있는데, 이는 해당 패키지에 정의된 모든 클래스가 동일한 JAR 파일에 보관됨을 의미한다. 패키지는 소프트웨어 내 클래스 간의 버전 일관성을 보장하거나 보안 조치를 위해 봉인될 수 있다.

패키지를 봉인하려면 매니페스트 파일에 `Name` 항목을 표시하고, 그 뒤에 `Sealed` 헤더를 추가해야 한다. 예를 들면 다음과 같다.

```properties

Name: myCompany/myPackage/

Sealed: true

```

`Name` 헤더의 값은 패키지의 상대 경로 이름이다. 파일 이름과 구별하기 위해 '/'로 끝난다. `Name` 헤더 뒤에 오는 모든 헤더는 빈 줄이 없으면 `Name` 헤더에 지정된 파일 또는 패키지에 적용된다. 위의 예에서 `Sealed` 헤더는 빈 줄 없이 `Name: myCompany/myPackage` 헤더 다음에 나타나므로 `Sealed` 헤더는 (단독으로) `myCompany/myPackage` 패키지에 적용된다.

하지만 이러한 봉인된 패키지 기능은 Java 9에 도입된 자바 플랫폼 모듈 시스템에 의해 구식이 되었다. 모듈은 패키지를 분할할 수 없다.[9]

6. 3. 3. 패키지 버전 관리

JAR 파일 안에 포함되어 있는 매니페스트 파일은 메타데이터 정보를 포함하고 있다.[27][28] 이 메타데이터 정보에는 확장 정보 및 패키지 관련 데이터가 기술되어 있으며, 섹션 형식으로 구성된 키-값 쌍 형태의 문자열이다. JAR이 실행 가능하도록 하기 위해서는, 매니페스트 파일에 애플리케이션의 메인 클래스 이름이 기술되어 있어야 한다. 매니페스트 파일의 명칭은 `MANIFEST.MF`이며, 이 파일이 포함되어 있는 디렉토리는 압축된 파일의 내용물 가운데 가장 첫 번째 위치에 배치되어야 한다.

여러 매니페스트 헤더는 버전 정보를 담고 있다. 헤더 집합은 각 패키지에 할당될 수 있다. 버전 관리 헤더는 패키지의 이름 헤더 바로 아래에 나타난다. 다음은 모든 버전 관리 헤더를 보여주는 예시이다.

헤더설명값 예시
Name패키지 이름java/util/
Specification-Title규격 제목Java 유틸리티 클래스
Specification-Version규격 버전1.2
Specification-Vendor규격 제공자썬 마이크로시스템즈(Sun Microsystems, Inc.).
Implementation-Title구현 제목java.util
Implementation-Version구현 버전build57
Implementation-Vendor구현 제공자썬 마이크로시스템즈(Sun Microsystems, Inc.)


6. 3. 4. 멀티 릴리스

JAR는 선택적으로 멀티 릴리스 JAR로 표시될 수 있다. 멀티 릴리스 기능을 사용하면 라이브러리 개발자가 자바 런타임 버전에 따라 다른 코드를 로드할 수 있다.[10] 이를 통해 개발자는 호환성을 잃지 않고 새로운 기능을 활용할 수 있다.

멀티 릴리스 JAR는 매니페스트에서 다음 선언을 사용하여 활성화된다.

```properties

Multi-Release: true

6. 3. 5. 종속성

JAR 파일 안에 포함된 매니페스트 파일은 메타데이터 정보를 담고 있다.[27][28] 이 메타데이터에는 확장 정보 및 패키지 관련 데이터가 섹션 형식의 키-값 쌍 형태 문자열로 기술되어 있다.

JAR 파일을 실행 가능하게 하려면 매니페스트 파일에 애플리케이션의 메인 클래스 이름을 명시해야 한다. 매니페스트 파일의 이름은 `MANIFEST.MF`이며, 압축된 파일 내용물 중 가장 첫 번째 위치에 있는 디렉토리에 포함되어야 한다.

`MANIFEST.MF` 파일은 애플리케이션 실행에 필요한 모든 클래스를 지정하는 데 사용될 수 있다.[11] Class-Path 항목은 시스템 경로 구분자가 아닌 공백으로 구분된다.

```properties

Class-Path: . pkg1.jar path/to/pkg2.jar

7. 관련 포맷

JAR 포맷을 바탕으로 다음과 같은 파일 포맷들이 생겨났다.

포맷설명
WAR웹 애플리케이션을 구성하는 자바 클래스와, 자바 서버 페이지, 관련 XML 파일 등을 묶은 압축 파일 포맷
RARJ2EE 커넥터 아키텍처(JCA) 애플리케이션을 묶는데 사용되는 압축 파일 포맷
EAR자바 엔터프라이즈 애플리케이션에서 이용되는 압축 포맷으로, 애플리케이션 클래스 및 관련 JAR, WAR, RAR 압축 파일들을 묶는 용도로 사용
APK안드로이드 애플리케이션에서 사용되는 자바 압축 포맷의 일종[29]
AARMaven을 통해 Android 라이브러리를 배포하는 데 사용[13]
PAR이클립스 버고 OSGi 애플리케이션 서버에서 지원되며, 여러 번들 OSGi 애플리케이션을 단일 아카이브로 배포하고 동일한 서버에 배포된 다른 PAR 기반 애플리케이션으로부터 격리
KARApache Karaf OSGi 애플리케이션 서버에서 지원되며, 여러 번들, 여러 기능 OSGi 애플리케이션을 배포



일반적으로 C 언어나 C++ 등으로 작성된 머신 네이티브 프로그램이나 라이브러리(네이티브 코드)도 아카이브로 묶여 배포되는 경우가 많지만, 이들은 압축을 풀고 설치해야 한다. 이에 반해 Java 실행 환경 (JRE) 등에 포함된 Java의 표준 도구는 JAR을 직접 처리할 수 있으므로 사용자가 명시적으로 JAR을 압축 해제할 필요가 없다.

유사한 아카이버로 JSP/Servlet 등의 웹 애플리케이션을 하나의 아카이브로 묶는 WAR (Web Application Archive), EJB (Enterprise JavaBeans) 애플리케이션을 하나의 아카이브로 묶는 EAR (Enterprise Archive) 등이 있다.

8. Apache Ant Zip/JAR 지원

아파치 앤트 빌드 도구는 유닉스 파일 시스템 확장을 지원하는 것을 포함하여 Zip 및 JAR 아카이브를 읽고 쓰기 위한 자체 패키지를 가지고 있다. org.apache.tools.zip 패키지는 아파치 소프트웨어 재단 라이선스 하에 배포되며 앤트 외부에서도 사용할 수 있도록 설계되었다.

9. 하위 호환성

JAR 파일은 하위 호환성은 있지만, 상위 호환성은 보장되지 않는다. 이전 버전의 JDK로 생성한 JAR을 새로운 버전의 JDK로 사용하거나 새로운 버전의 JRE로 실행하는 것은 가능하지만, 반대로 새로운 JDK로 생성한 JAR을 이전 JDK로 사용하거나 이전 JRE로 실행해서는 안 된다[19]. Java SE 20까지는 JAR 파일 사양의 하위 호환성에 관해 문서에 기재되어 있었지만[20], Java SE 21 이후에는 특별히 언급되어 있지 않다[21].

참조

[1] 웹사이트 File Extension .JAR Details https://filext.com/f[...] 2012-11-29
[2] 웹사이트 MIME : Java Glossary http://mindprod.com/[...] 2012-11-29
[3] 웹사이트 IANA Assignment https://www.iana.org[...] 2023-05-12
[4] 웹사이트 JDK 6 Java Archive (JAR)-related APIs & DeveloperGuides http://java.sun.com/[...]
[5] 웹사이트 JAR File Specification http://docs.oracle.c[...] Oracle
[6] 웹사이트 Understanding the Manifest http://java.sun.com/[...] Java.sun.com 2012-07-31
[7] 웹사이트 JAR File Specification http://download.orac[...] Download.oracle.com 2012-07-31
[8] 웹사이트 JAR File Specification https://docs.oracle.[...] Download.oracle.com 2012-07-31
[9] 웹사이트 JEP 261: Module System https://openjdk.java[...] 2021-02-06
[10] 웹사이트 JEP 238: Multi-Release JAR Files https://openjdk.java[...] 2021-02-06
[11] 문서 the sun servlet specification, page 72 (servlet-2_4-fr-spec.pdf). See also the Java Tech Notes https://docs.oracle.[...]
[12] 웹사이트 Glossary https://developer.an[...]
[13] 웹사이트 Android library https://developer.an[...]
[14] 문서 Java Archive (JAR) Features. Manifest Format http://www.cse.yorku[...]
[15] 문서 JDK 6 Java Archive (JAR)-related APIs & Developer Guides https://docs.oracle.[...]
[16] 문서 JDK 6 Java Archive (JAR) 関連 API & 開発者ガイド -- Sun Microsystems https://docs.oracle.[...]
[17] 문서 javac - Java プログラミング言語コンパイラ | JDK 6 ドキュメント https://docs.oracle.[...]
[18] 문서 JARファイルとは - 意味をわかりやすく - IT用語辞典 e-Words https://e-words.jp/w[...]
[19] 문서 Interstage Application Serverにおいて、特定のJDKバージョンで作成したjarファイルを、古いJDKバージョンで動作させることはできますか? - Fujitsu Japan https://www.fujitsu.[...]
[20] 문서 JAR File Specification - §Backward Compatibility | Oracle Java SE 20 https://docs.oracle.[...]
[21] 문서 JAR File Specification | Oracle Java SE 21 https://docs.oracle.[...]
[22] 웹인용 File Extension .JAR Details http://filext.com/fi[...] 2012-11-29
[23] 웹인용 MIME : Java Glossary http://mindprod.com/[...] 2012-11-29
[24] 웹인용 JDK 6 Java Archive (JAR)-related APIs & DeveloperGuides http://java.sun.com/[...]
[25] 웹인용 보관된 사본 http://download.java[...] 2013-04-22
[26] 웹인용 윈도우 jar 파일 실행 - 제타위키 https://zetawiki.com[...] 2023-01-04
[27] 웹인용 Understanding the Manifest http://java.sun.com/[...] Java.sun.com 2012-07-31
[28] 웹인용 JAR File Specification http://download.orac[...] Download.oracle.com 2012-07-31
[29] 웹인용 Glossary https://developer.an[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com