[Java] jar파일만들기(Manifest이용)



1️⃣ jar파일이란?

  • C언어에서는 라이브러리파일(아카이브)로 오브젝트파일을 압축시킬 수 있으며 실행파일(.exe, .out)로 만들어 실행할 수 있습니다.
  • 자바에서는 jar파일이 C언어에서 라이브러리실행파일의 역할을 둘다 하게됩니다.
  • 엄밀히말하면 jar파일압축파일일뿐입니다.


2️⃣ Manifest를 이용한 jar파일

(1) jar명령어

jar <옵션> <jar 파일이름> <최상위패키지 경로>

(2) 테스트파일구조

compile19

(3) 테스트파일로 .jar파일 만들기

  • 먼저 프로젝트에 lib폴더를 생성해주었습니다. (library의 약자)
test%>jar -cf ./lib/test.jar ./class/first

< 생성된 jar파일 >

compile20

  • -c: 생성옵션으로 jar파일을 만들기위해 꼭있어야할 옵션입니다.
  • -f: jar파일의 위치와 이름을 지정해줄 수 있는 옵션입니다.

(4) jar파일 압축풀기

  • 압축이 풀리는 모습을 보기위해 기존의 class파일을 제거해 주었습니다.
test%>jar -xvf ./lib/test.jar
  생성됨: META-INF/
 증가됨: META-INF/MANIFEST.MF
  생성됨: class/first/
  생성됨: class/first/second/
 증가됨: class/first/second/test.class
 증가됨: class/first/second/main.class

< 압축풀기 전 >

compile1

< 압축풀기 후 >

compile2

(5) jar파일 실행하기

test%>java -jar ./lib/test.jar
./lib/test.jar에 기본 Manifest 속성이 없습니다.
  • Manifest의 속성이 없기 때문에 실행이 안된다고 오류가출력됩니다.


3️⃣ jar파일 실행하기

(1) Manifest파일 만들기

  • Manifest파일은 자바 에플리케이션의 정보를 담은 메타데이터 파일입니다.
  • 먼저 src폴더내부에 Manifest.txt파일을 만든 뒤 클래스파일을 다음과같이 적어줍니다. /_ Manifest.txt _/
    Class-Path: ../class/
    Main-Class:first.second.main

  • Class-Path: 클래스파일의 위치를 적어줍니다.(jar파일기준으로 상대경로)
  • Main-Class: main메서드를 가지고있는 클래스명
  • MacOs(리눅스계열)의 경우 마지막에 공백줄을 잊지말아야 합니다.
  • 다음명령을 입력하여 Manifest를 추가하여 다시 jar파일을 만들어 줍니다. test%>jar -cfvm ./lib/test.jar ./src/Manifest.txt ./class/first
    Manifest를 추가함
    추가하는 중: class/first/(입력 = 0) (출력 = 0)(0%를 저장함)
    추가하는 중: class/first/second/(입력 = 0) (출력 = 0)(0%를 저장함)
    추가하는 중: class/first/second/test.class(입력 = 446) (출력 = 298)(33%를 감소함)
    추가하는 중: class/first/second/main.class(입력 = 332) (출력 = 245)(26%를 감소함)
  • -m: Manifest를 추가해주는 옵션
  • -v: 과정을 출력해주는 옵션(입력에보다 출력이 감소한 것으로 보아 실제로 압축효과가입음을 확인)

(2) Manifest파일 만들기(특이케이스)

  • 사실 추가해줄 Manifest파일의 명은 아무거나 상관없습니다.

    ex) aa.txt

  • 하지만 관습상 Manifest.txt로 만들어 줍니다.
compile23
▪️ 위에서 jar파일을 압축을 풀때 자동으로 생성됬던 MANIFEST.MFManifest파일로 이용해도 됩니다.
▪️ 자동으로 생성된 MANIFEST.MF파일에는 아래와 같이 jar파일에대한 정보가 적혀있었습니다.

< 자동생성된 MANIFEST.MF에 적힌내용 >

/* MANIFEST.MF */
Manifest-Version: 1.0
Created-By: 11.0.11 (AdoptOpenJDK)

  • 다음과 같이 텍스트를 추가해주어 사용하면 됩니다. /_ MANIFEST.MF _/
    Manifest-Version: 1.0
    Created-By: 11.0.11 (AdoptOpenJDK)
    Class-Path: ../class/
    Main-Class: first.second.main

  • 하지만 META-INF/MANIFEST.MF은 압축을 풀때 생성되는 파일이기 때문에 src폴더Manifest.txt파일을 만들어 사용하는 것이 좋을 것 같습니다.

(3) jar파일 실행

test%>java -jar ./lib/test.jar
hello world!%
  • 정상적으로 잘 출력됐습니다.




© 2021.02. by kirim

Powered by kkrim