어제 .jar 파일의 repack 작업을 하면서 jar 명령어에 대해 정리할 필요가 있었다. 아무래도 각자 다른 개발환경 아래의 컴퓨터를 서로 다른 사람들이 사용하고 있으니 같은 명령어라도 다른 결과물이 나온다는 생각이 들었기 때문이다. 이제 무조건 [Ctrl] + [C] & [Ctrl] + [V] 하기 보다는 과정 하나하나를 이해하려고 노력해야지. 우선은 jar 부터 시작하자.

  먼저 .jar file 자체의 정의를 보니 Java platform에서 app과 같은 응용 프로그램이나 library로 사용할 수 있도록 여러 파일을 묶어 놓은 패키지(packaging) file format으로, 일종의 .zip과 같은 파일 묶음과 같은 것이었다. 그렇다 보니 지난 번에 참조했던 조언과 같이 unzip 명령이 jar file을 풀 수 있었던 모양이다.

"JAR(Java Archive, 자바 아카이브)는 소프트웨어에서 수많은 자바 클래스 파일과 연관 메타데이터, 리소스(텍스트, 그림 등)을 하나의 파일로 모아서 자바 플랫폼응용 소프트웨어라이브러리를 배포하기 위한 패키지 파일 포맷이다.[1]

  JAR 파일은 실제로 ZIP 파일 포맷으로 이루어진 압축 파일로서, 파일 확장자는 .jar이다. 컴퓨터 사용자들은 JDK에 포함된 jar 명령어를 이용하여 JAR 파일을 만들거나 압축을 풀 수 있다. 또, zip 도구를 사용할 수도 있으나 압축 시에는 매니페스트 파일이 처음이어야 하는 경우가 있어서 zip 파일 헤더의 엔트리 순서가 중요하다. JAR 안에서 파일 이름들은 유니코드 텍스트로 되어 있다."

[참고] Wikipedia - https://ko.wikipedia.org/wiki/JAR_(%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7)

 

  이렇다 보니 .jar file을 사용하고 또 생성하기 위해서는 Java platform 환경이 갖추어져 있어야 하는데, 그것이 JDK(Java Development Kit)이다. 요즘은 인터넷을 활용하는데도 Java platform이 필요하다보니 웬만해서는 다 설치되어 있겠지만, 혹시나 깔끔하게 다시 설치해야 한다면 Oracle 홈페이지 내 Java SE Development Kit를 download하여 설치하면 되겠다(2015년 11월 27일 현재 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 에 방문하면 Java SE Development Kit 8u65/8u66 을 Linux나 Windows 32-bit(x86)/64-bit(x64)와 같은 사용자의 사용 환경에 맞춰 설치할 수 있다).

 

  이렇게 설치하고 나면, 해당 JDK를 사용자가 어느 위치에서나 편하게 활용할 수 있게끔 환경변수를 설정해 주어야 하는데 Windows 7 기준으로 1) [시작] - [컴퓨터] 오른쪽 클릭해 메뉴 도출 - [속성] 순으로 접근하던가 2) [제어판] - [시스템] 순으로 들어가면 나타나는 창에서 왼쪽 상단의 메뉴 중 맨 끝에 있는 [고급 시스템 설정]을 클릭해 [시스템 속성 - 고급 탭] 을 띄워 창 하단의 [환경 변수] 버튼을 클릭, 그리고 path(혹은 Path, PATH)변수에 java.exe에 접근할 수 있도록 (컴퓨터 내 jdk 설치 directory)\bin을 추가한다(혹은 추가되었는지 확인한다). 혹시 이 과정이 귀찮다면 java.exe가 설치되어 있는 폴더 내에서 jar 명령어를 동작시키면 되긴 했는데, 환경변수를 설정하는 쪽이 추후에 더 편리했다.

   

 

  이제 console(ex. cmd)을 띄워, jar 명령어를 다음과 같이 활용한다. 기본적으로 jar {ctxu}[vfm0M] (jar file name).jar (대상이 되는 directory name) (.jar file이 생성되는 지점)으로 구성되는데 주로 중괄호 {}에 해당하는 명령어가 c이면 jar 압축, x이면 jar 압축 해제, 대괄호 []에 해당하는 명령어로 v와 조합할 경우 해당 c 또는 x 명령 수행 과정을 console에 나타내며, f의 경우 해당 manifest를 포함함을 의미한다.

jar {ctxu}[vfm0M] [jar-file] [manifest-file] [-C dir or files] ...

 

  1) {ctxu} 필수 option
    - c : archive 파일(.jar file)을 생성
    - t : [jar-file]에 해당하는 archive file의 content list를 설정
    - x : 뒤에 [jar-file]에 해당하는 archive 파일(.jar file)의 압축 해제
    - u : [jar-file]에 해당하는 archive 파일 내에 들어있는 파일을 수정

  2) [vfm0M] 앞의 {ctxu}의 동작을 도와주는 option
    - v : console 창으로 진행 사항에 관한 메시지를 모두 출력. 안 쓸 경우, 중요 error message만 console 창에 뿌려주었다.
    - f : archive 될 파일 이름을 지정
    - m : manifest 파일로부터 정보를 포함
    - 0 : 저장(묶기)만 하고, zip으로 압축지 않음
    - M : 추가되는 entry에 대해 manifest 파일을 생성하지 않음

  3) [jar-file] archive 대상이 되는 .jar file의 이름

  4) [manifest-file] 정보를 포함할 manifest file의 이름

  5) [-C dir or files] archive 할 directory 명 혹은 file 명. 명기한 순서대로 처리.

 

  (사용 예시) 

 

  Android app으로 word 파일(.docx/.doc)를 볼 필요가 생겨서 관련된 library를 찾다가 먼저 Apache POI를 발견했다. 아직 App 개발에 익숙하지 않아 개발 환경을 꾸미는 것만으로도 구글링하면서 진땀을 뺐는데, 겨우겨우 관련 .jar file을 import하고 compile을 해보니 이게 웬 걸. duplicate class 어쩌구 하는 error가 떡하니 뜨는게 아닌가?

 

 

  구글링으로 해당 error의 이유를 보니 애초에 배포된 xmlbeans-2.6.0.jar 내에 중복된 이름의 class가 있어 그렇다고 한다. 이 문제를 해결하려면 직접 xmlbeans-2.6.0.jar를 푼 다음(unzip) 다시 jar로 repack을 해야한다는데, 일단 개발환경 내에 jar 명령어가 동작할 수 있도록 JDK를 설치해야 했다(JDK는 android studio의 구동을 위해 필히 설치해야하는 항목이었으므로 보통은 C:\Program Files\Java 내에 jdk1.x.x_xx 따위의 directory로 정리되어 설치되어 있을 것이다). 그리고 다른 경로에서도 java.exe를 활용할 수 있도록 window의 Path 환경변수에 (내 컴퓨터 내 Java jdk 경로)\bin을 추가해 놓아야 했다.

   

  

 

  그리고 POI-bin 내에 xmlbeans-2.6.0.jar 파일을 찾아 압축을 푼다. 나는 여기서 7-Zip을 활용했다. 압축을 풀다 보면 문제가 됐었던 중복된 class 파일들에 대해 대체여부를 묻는 창이 뜨는데 '모두 예(A)'를 선택하여 대체했다.

 

  다음으로 콘솔을 실행하여 압축을 푼 해당 directory에 들어가서 'jar cf (repack할 jar file명).jar -C *'을 수행했다. 다른 분들의 조언에 따르면 'jar cf (repack할 jar file명).jar -C * .'을 해야한다는데, 내 컴퓨터 환경에서는 그렇게 하면 환경 자체의 문제점이 있는 모양인지 손상된 jar file이 생성되어 제대로 동작하지 않았다. 혹시나 나와 비슷한 문제를 겪고 있는 분들이 있다면 jar 명령어에 관한 reference를 찾아 살짝 바꿔서 실행해 보면 원하는 결과가 나올지도 모르겠다.

 

 

  이제 새로 생성된 xmlbeans-2.6.0-repack.jar를 app library에 추가하여 compile/run을 시켜보았다. 그 결과 실행은 되긴 했으나 app이 XWPFDocument(); method를 거치는 순간 중단되는 문제가 발생하였다. 그러나 이 문제는 xmlbeans-2.6.0.jar 파일의 유무와 상관없이 그전에도 일어났던 터라 해당 파일과는 상관이 없으리라 생각된다. 이제 이 다음 문제를 해결해야지.

 

 

+ Recent posts