게으른 개발자의 끄적거림

.jar파일이란?

끄적잉 2024. 10. 11. 22:05

 

### .JAR 파일이란?

**JAR** 파일은 **Java ARchive**의 약자로, Java 애플리케이션을 배포하고 실행하는 데 사용되는 압축 파일 형식입니다. 이 파일 형식은 Java 플랫폼에서 여러 파일을 하나로 묶는 방법으로 널리 사용되며, Java 클래스 파일과 관련 리소스(이미지, 텍스트, 메타데이터 등)를 포함할 수 있습니다. JAR 파일은 ZIP 파일 형식을 기반으로 하지만, 그 안에 Java 환경에 필요한 추가적인 메타데이터를 포함할 수 있습니다.

 


### 1. JAR 파일의 목적

JAR 파일은 다음과 같은 여러 가지 용도로 사용됩니다.

1. **애플리케이션 배포**: JAR 파일은 Java 애플리케이션을 배포하는 표준 방식입니다. 애플리케이션이 필요로 하는 모든 파일(클래스 파일, 텍스트 파일, 이미지 등)을 하나의 JAR 파일로 묶어 쉽게 배포할 수 있습니다.
   
2. **라이브러리 패키징**: 많은 Java 라이브러리들이 JAR 파일 형식으로 배포됩니다. 개발자는 이러한 라이브러리 JAR 파일을 프로젝트에 포함시켜 다양한 기능을 손쉽게 사용할 수 있습니다.


3. **클래스 로더(ClassLoader) 사용**: JAR 파일은 Java 가상 머신(JVM)에서 클래스 로딩 메커니즘과 통합되어 있습니다. 이를 통해 JVM은 애플리케이션을 실행할 때 JAR 파일 안에 있는 클래스를 자동으로 로드할 수 있습니다.

4. **애플릿(Applet) 및 웹 애플리케이션 배포**: JAR 파일은 웹 브라우저에서 실행되는 Java 애플릿을 배포하는 데에도 사용될 수 있습니다. 또한, 서블릿(Servlet)과 같은 Java 웹 애플리케이션 구성 요소를 묶어서 배포할 때도 자주 사용됩니다.

 


### 2. JAR 파일의 구조

JAR 파일은 ZIP 파일 형식을 기반으로 하지만, 내부에 몇 가지 특별한 파일을 포함할 수 있습니다. 이러한 파일들은 Java 애플리케이션이 올바르게 실행될 수 있도록 돕습니다. JAR 파일은 보통 다음과 같은 구조를 가지고 있습니다.

- **.class 파일**: 컴파일된 Java 클래스 파일. JAR 파일의 주요 구성 요소입니다.
- **리소스 파일**: 애플리케이션에서 사용하는 이미지, 텍스트 파일, 프로퍼티 파일 등이 포함될 수 있습니다.
- **MANIFEST.MF 파일**: JAR 파일의 메타데이터를 저장하는 특별한 파일입니다. JAR 파일의 루트 디렉토리 안의 **META-INF** 폴더에 저장됩니다. 이 파일에는 애플리케이션을 실행할 때 JVM이 참조해야 할 주요 정보가 포함됩니다. 예를 들어, 메인 클래스(Main-Class)를 지정하여 `java -jar` 명령으로 JAR 파일을 실행할 수 있도록 설정할 수 있습니다.

#### 예시: MANIFEST.MF 파일
```
Manifest-Version: 1.0
Main-Class: cohttp://m.example.Main
```
위의 MANIFEST 파일에서는 JAR 파일을 실행할 때 JVM이 **cohttp://m.example.Main** 클래스를 진입점으로 사용하라고 지정하고 있습니다.

 


### 3. JAR 파일의 생성 및 사용 방법

JAR 파일은 Java 개발 도구(JDK)에 포함된 `jar` 명령어를 사용하여 생성하고 관리할 수 있습니다.

#### 3.1 JAR 파일 생성하기
JAR 파일을 생성하기 위해서는 컴파일된 .class 파일들과 리소스 파일들을 준비한 후, `jar` 명령어를 사용합니다.

예를 들어, 다음과 같은 디렉토리 구조가 있다고 가정합니다:
```
/project
    /com
        /example
            Main.class
            Helper.class
    /resources
        config.properties
```

이 디렉토리에서 JAR 파일을 생성하는 명령어는 다음과 같습니다:
```bash
jar cvf app.jar -C /project .
```


- **`c`**: 새로운 JAR 파일을 생성하라는 뜻입니다.
- **`v`**: 생성 과정에서 처리된 파일 목록을 출력합니다.
- **`f`**: JAR 파일의 이름을 지정합니다.
- **`-C`**: 특정 디렉토리에서 파일을 가져오도록 지정합니다.

이 명령어는 `app.jar` 파일을 생성하며, 이 파일에는 **/project** 디렉토리 안의 모든 파일이 포함됩니다.

 


#### 3.2 JAR 파일 실행하기
JAR 파일이 생성되면, 이를 실행하기 위해 다음과 같은 명령어를 사용할 수 있습니다:
```bash
java -jar app.jar
```
이 명령어는 **MANIFEST.MF** 파일에 지정된 메인 클래스를 기반으로 애플리케이션을 실행합니다.

 


### 4. JAR 파일의 특징

#### 4.1 플랫폼 독립성
JAR 파일은 플랫폼에 독립적인 파일 포맷입니다. 이는 Java 자체가 플랫폼 독립적이기 때문에 가능합니다. Java 애플리케이션은 JVM 위에서 실행되므로, JAR 파일은 한 번만 작성되면 다양한 운영체제에서 실행될 수 있습니다.

#### 4.2 압축
JAR 파일은 ZIP 형식으로 압축되기 때문에 저장 공간을 절약할 수 있습니다. 또한, 파일을 하나로 묶음으로써 관리가 용이하고 파일 전송 시에도 여러 파일을 하나씩 전송하는 것보다 효율적입니다.

#### 4.3 디지털 서명
JAR 파일은 디지털 서명을 지원합니다. 이 기능을 사용하면 파일의 출처를 확인하고, JAR 파일이 변조되지 않았음을 보장할 수 있습니다. 이를 통해 신뢰할 수 있는 소프트웨어 배포가 가능합니다.

#### 4.4 Class-Path 설정
JAR 파일의 **MANIFEST.MF** 파일에는 `Class-Path` 항목을 설정할 수 있습니다. 이 항목은 애플리케이션 실행 시 사용할 다른 JAR 파일이나 외부 라이브러리의 경로를 지정하는 데 사용됩니다.

```
Class-Path: lib/library1.jar lib/library2.jar
```

위의 예시에서는 **lib/library1.jar**와 **lib/library2.jar**가 실행 시 클래스 패스에 추가됩니다.

 


### 5. JAR 파일의 장점과 단점

#### 5.1 장점

1. **편리한 배포**: 여러 파일을 하나의 JAR 파일로 묶으면 애플리케이션 배포가 간단해집니다.
2. **압축**: JAR 파일은 기본적으로 압축되어 있어 파일 크기를 줄이고 전송 시간을 절약할 수 있습니다.
3. **안정성**: 디지털 서명을 통해 JAR 파일의 무결성을 확인할 수 있으며, 이로 인해 안전한 소프트웨어 배포가 가능합니다.
4. **플랫폼 독립성**: Java 프로그램은 JVM 위에서 실행되므로, JAR 파일은 여러 운영체제에서 동일하게 실행될 수 있습니다.

#### 5.2 단점

1. **보안 취약점**: JAR 파일은 실행 가능 파일이기 때문에, 악성 코드가 포함될 경우 시스템에 해를 끼칠 수 있습니다. 따라서 신뢰할 수 없는 출처에서 받은 JAR 파일은 실행하기 전에 주의해야 합니다.
2. **압축 수준 제한**: JAR 파일의 압축률은 일반적인 ZIP 파일과 동일한 수준이므로, 다른 더 고성능의 압축 형식에 비해 압축률이 낮을 수 있습니다.
3. **복잡한 의존성 관리**: 대규모 프로젝트에서는 여러 JAR 파일 간의 의존성을 관리하는 것이 복잡할 수 있습니다. 이를 해결하기 위해 Maven이나 Gradle과 같은 빌드 도구가 자주 사용됩니다.

 


### 6. JAR 파일과 WAR/EAR 파일의 차이점

Java 애플리케이션을 배포할 때 JAR 파일 외에도 **WAR**(Web Application Archive) 및 **EAR**(Enterprise Application Archive) 파일이 사용될 수 있습니다.

- **WAR 파일**: 주로 서블릿, JSP 파일 등을 포함하는 웹 애플리케이션을 배포할 때 사용됩니다. JAR 파일과 유사하지만, 특정 구조를 따르며 웹 서버나 애플리케이션 서버에서 실행됩니다.
  
- **EAR 파일**: 여러 JAR 파일과 WAR 파일을 하나로 묶은 파일로, 대규모 엔터프라이즈 애플리케이션을 배포하는 데 사용됩니다.

### 결론

JAR 파일은 Java 애플리케이션 배포에 필수적인 요소로, 여러 파일을 하나로 묶어 편리하게 관리하고 배포할 수 있는 방법을 제공합니다. 압축, 디지털 서명, 플랫폼 독립성 등의 장점을 통해 소프트웨어의 안정성과 효율성을 높이지만, 보안 위험과 의존성 관리의 복잡성 등 몇 가지 단점도 고려해야 합니다.