'JAR'에 해당되는 글 2건

  1. 2009.01.16 jar파일에서 외부 패키지 사용하기
  2. 2009.01.12 jar 실행파일 만들기
2009. 1. 16. 09:19

jar파일에서 외부 패키지 사용하기

사람이 밥만먹고 살 수는 없듯이, 프로그램을 짜다보면 외부 jar파일을 이용해야 하는 경우가

수시로 생기게 된다. 문제는, 내가 짠 프로그램을 jar파일로 배포해야 할때도 내가 사용했던

외부 jar파일이 필요하게 된다는 것이다.


내가 만든 jar파일에서 외부 jar파일을 사용해야 한다면 어떤 방법이 가장 좋을까..

내가 생각하기에는 내 jar파일을 만들때 외부 jar파일도 함께 묶고 Class-Path를 잘 지정해

주는것이 가장 좋은 방법이 아닐까 싶다. 이렇게 해놓으면 내 jar파일 내부에 있는 클래스들이

외부 jar파일을 참조할 수 있고, 외부 jar파일역시 내 jar파일 외부로 나와있어서 실수로 삭제되거나

하는 일이 발생하지 않는다.

그런데, 문제는 java의 jar파일은 이러한 기능을 지원하지 않는다는 것이다. 아래는 jar Document

부분의 Class-Path에 관한 내용의 일부이다.

 

===========================================================================

Note: The Class-Path header points to classes or JAR files on the local file system, not JAR

          files within the JAR file or classes on the network

=> Class-Path header 부분에는 사용자의 컴퓨터 내부의 class파일이나 JAR파일은 이용할

    있지만 JAR파일 내부, 또는 network 상의 JAR파일이나 class파일들은 사용할 수 없습니다.

===========================================================================

 

이 글에서 볼 수 있듯이 java에서는 jar파일 내부의 jar파일에 대해서 Class-Path를 지원해 주지

않는다. 즉, jar파일 내부에 외부 jar파일을 위치시켜 놓고 프로그램이 무난히 작동되기를 바랄 수

없다는 뜻이다.


그렇다면 어떻게 외부 jar파일을 이용할 수 있을까. 크게 두가지 방법이 있다.

1) 외부 jar파일의 압축을 풀고, 압축이 풀린 class들을 내 jar파일에 묶어버리는 방법

2) 외부 jar파일을 내 jar파일의 내부가 아닌 외부에 위치시켜 놓고 Class-Path를 설정하는 방법

2009. 1. 12. 12:33

jar 실행파일 만들기

jar(Java Archive)에 대해서 
1. jar파일이란 : jar파일은 archive파일이다. 
즉 여러개의 파일을 하나의 파일로 묶는jar명령을 사용하여 생성된다. 
이 파일은 winzip에서 열어 볼 수 있으며, winzip에서 열어보면 여러개의 파일들이 디렉토리 정보를 
가진채 들어 있다.
(아무 jar파일을 직접클릭해 열어 보시라)
 
2. zip 파일과 다른 점 : winzip과 다른점은 압축되어 있을수도 있고, 그냥...하나로 묶어놓은 파일일수
도 있다.
그래서 jar 파일을 archive파일이라 볼수 있다. 
이렇게archive파일로 묶는 이유는 자바로 개발한 여러클래스 파일들 또는 패키지 파일이있을때, 이를 
하나로 묶어두면,
그 클래스들을 참조하기도 편하고, 다운 받기도 쉽다.(애플릿의 경우 더욱 그러함)
 
3. jar명령 사용하기 
(1) 명령구문 : jar {ctxu}[vfm0M] [jar-file] [manifest-file] [-C dir] files ...
(2) {ctxu} 중의 하나는 맨 앞에 나와야할 필수 옵션이다.    
: c  (새로운 archive파일을 생성한다)    
: t  list table of contents for archive     
: x  (다음에 지정한 파일들을 archive파일로 부터 압축을 푼다)    
: u  (기존 archive파일에 들어있는 파일을 수정한다.)
(3) [vfm0M]은 {ctxu} 중의 하나다음에 오는 옵션이다.	
: v  (명령화면창으로 진행사항에 관한 메시지를 출력한다.):웬만하면 써주면좋음..    
: f  (archive될 파일이름을 지정한다.) : 그래도 생성될 파일의 이름은 써줘야겠죠?    
: m  (정보를 manifest파일로 부터 포함한다.)    
: 0  (저장만 하고, zip으로 압축하진 않는다.)      
-  클래스파일을 압축하면 곤란하죠...class파일의 경우는 꼭..써줘야죠..    
: M  (추가되는 엔트리에 대한 manifest 파일을 생성하지 않는다.)
(4) -C  (지정된 디렉토리로 바꾸고, 다음 파일을 포함한다.)	
: 어떤 파일이 디렉토리이면 순환되면서 처리된다. 
(5) manifest file이름과 archive파일 이름은 순서대로 지정되어야 한다.
(6) manifest file : 뭐...대단한 파일인줄 알았는데, 열어보면 내용이 다음과 같습니다.    
: m옵션을 주어 지정하는데 뭐....중요한건 아닌거 같으니까...이런게 있다는것만 아셔도 될듯..   
<내용>
Manifest-Version: 1.0
Created-By: 1.2.2 (Sun Microsystems Inc.)
4. 사용예예) jar cvf new.jar 1.class 2.class
: c옵션이 사용되었으므로 일단은 1.class, 2.class를 묶으려고 시도할 것이다.  
(생성시는 반드시 f옵션을 줘야함, 안주면 어케 될까?...함해봐요...컴에서 삑삑  소리가 나올것임..-.-;
왜그런지는 아시겠죠?)
: v옵션이 사용되었으므로 진행상황 메시지가...줄줄 나올것이다. (이건 안해도 됨)
: f옵션은 c옵션사용시 생성될 파일명을 지정(반드시 해주어야 지정된 이름으로 파일이  생성된다.)
예) jar cvf new.jar -C test/ .
: -C옵션을 주면 현 디렉토리 아래의 test디렉토리에 있는 모든 파일을 new.jar로  묶어준다.
예) jar cvf new.jar -C /test .
: 위의 것이랑 비슷하지만... test디렉토리 뿐 아니라 현디렉토리에 있는 파일도    new.jar로 묶어준다.
예) jar xf test.zip: x옵션은 아카이브를 푼다는 의미, f는 아시죠...?
예) jar ufv0 new.jar test
: u옵션은 test디렉토리 밑의 파일들을 new.jar에 추가한다는 의미...(test디렉토리에  파일이 
있어야겠죠..?)
: 0옵션은 압축하지 말고 추가하라는 의미(클래스 파일의 경우는 이 옵션을 써줘야함)
: f와 v는 아시겠죠...?
 
하나의 자바 응용 프로그램을 실행할때 수십개의 클래스 파일이디렉토리 내에 존재해야 하는 경우가
있습니다.
응용프로그램에서 jar 파일을 이용하게 되면 jar 파일을 받아서 풀어주고실행시켜 주면 되지요. 
하지만 jar 압축시에 추가적인 정보를 지정하는 manifest file의 설정으로 파일을 풀지 않고 jar 파일의 
main() 메소드를찾아 프로그램을 실행(java -jar 옵션을 통해) 시켜 줄 수 있는 설정을 할 수 있습니다. 
Manifest.mf 파일은 jar로 파일을 압축하는 경우 생성되는 파일로 META-INF 디렉토리하에 생성됩니다. 
이 파일을 하나 받아 다음과 같이 파일에 Main-Class 항목을 추가하여 적어줍니다. 
* 파일(manifest.mf)내용.. 
(main() 메소드는 Ness.class 에 있는 경우)
Manifest-Version: 1.0
Created-By: 1.3.1 (Sun Microsystems Inc.)
Main-Class: Ness <= 추가부분
* jar 파일로 클래스 묶어주기 (현재 디렉토리의 모든 class 파일과 image 디렉토리의 파일들을 
묶고manifest.mf 파일을 적용시켜
 ness.jar 파일을 생성합니다. )
jar -cfm ness.jar manifest.mf *.class image
* 실행 다음과 같이 입력하면 자동으로 압축된 jar 클래스 파일로부터메인 클래스를 읽어들어 
실행하게 된다.
java -jar ness.jar 
단, 실행시에 image 디렉토리의 내용은 별도로 풀어주어야 합니다.
 
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1001644933&p=1&s=t

여러 개의 class 파일로 이뤄진 프로그램을 jar 형식의 파일로 합쳐서 배포할 수 있다. 하나의 파일로 관리할 수 있다는 장점뿐만 아니라, 압축이 되어서 용량도 더 작게 만들 수 있는 장점이 있다. 그리고, 다음에 설명할 exe 파일로 만들어 배포할 때도 이 jar 파일을 이용하면 편리한 장점을 얻을 수 있다. 이 문서에서는 jar 파일의 모든 옵션을 설명하진 않는다. 기본적인 생성 방법과 jar로 압축된 파일에서 실행시키기 위한 manifest 파일 생성 및 추가 방법에 대해서 설명하고자 한다.

jar 파일 생성하기

jar 프로그램의 기본적인 명령 순서는 다음과 같다.
jar <option> <target_file> <src_files>
jar 파일을 생성하기 위한 option은 c 이다. create 혹은 compress의 의미를 가지고 있을 것이라 생각된다. 그리고 압축이 되고 있는 상황을 볼 수 있게 하려면 v 라는 option을 쓰면, 파일의 압축과정을 볼 수 있다. 한가지 더 볼 것은 f option이다. 이것은 <target_file> 이름을 지정할 수 있도록 해주는 option이다. <src_files> 에는 파일이름이나 디렉토리 이름이 올 수 있다. 그럼, JavaAmp의 경우를 예를 들어 살펴 보자. JavaAmp는 myprojects.javaamp 패키지에 포함되어 있기 때문에 디렉토리 구성이 상당히 복잡하다. 그렇지만, package 자체를 jar 파일로 생성해주어야 하기 때문에, myprojects 의 부모 디렉토리로 나와서 myprojects 디렉토리 자체를 jar 파일로 생성해주면 된다. 즉,
jar cvf JavaAmp.jar myprojects
라고 명령을 주면 된다. 압축과정이 나타나고, 결과로 JavaAmp.jar 가 생성되었음을 볼 수 있을 것이다.

manifest 파일 수정하기

jar 파일이 생성되었다. 그런데, 실행은 어떻게 하나? jar 파일로 프로그램을 실행하기 위해서 java 인터프리터에서는 -jar 라는 옵션을 제공하고 있다. 즉, 다음과 같은 명령을 주면 된다.
java -jar JavaAmp.jar
-jar 옵션 다음에는 실행할 jar 파일을 지정하면 된다. 어라! 그런데 실행이 되지 않네? 우리는 main()을 포함하고 있는 클래스에 대한 정보를 전혀 주지 않았다. 그래서 java 인터프리터가 이 위치를 찾지 못해서 이러한 결과가 나타난다. 그렇다면 어떻게 해줘야 할까? 이 장에서 설명하고자 하는 manifest 파일이라는 것을 수정해야 한다. jar 파일은 winzip 프로그램에서도 지원하므로 winzip 프로그램을 이용해서 내부를 살펴보자. Manifest.mf 라는 파일을 찾을 수 있다. 이것이 바로 manifest 파일이다. 이 파일을 꺼내와서 내부를 살펴보자. 두 줄이 쓰여 있는데 version 정보만 들어 있다. 여기에 추가로 main class의 위치를 지정해주면 된다. 즉, 다음 한 줄을 추가하자.
Main-Class: myprojects.javaamp.JavaAmp
수정한 manifest 파일을 다시 jar 파일 내부로 수정해줘야 하는데 어떻게 하면 될까? 기존의 파일을 update 할 경우에는 u 옵션을 사용한다. 그리고 manifest 파일을 변경할 경우에는 m 옵션을 쓴다. 즉, 다음과 같은 명령으로 jar 파일의 manifest 파일을 update 할 수 있다.
jar umf Manifest.mf JavaAmp.jar
이제 다시 JavaAmp를 실행해보자. 이제 프로그램이 실행되는 것을 확인할 수 있을 것이다.

글을 마치며...

jar 파일은 여기에서 소개한 기능 말고도 많은 기능을 포함하고 있다. jar 파일로부터 추출하는 기능, 압축을 하지 않고 그대로 파일을 합쳐주는 기능 등이 있는데, 직접 확인해보도록 하자. jar 프로그램의 간단한 option은 파라메터를 넘기지 않고 그냥 jar 프로그램만 실행시키면 확인해볼 수 있다. 자세한 설명은 이 곳에서 확인해 볼 수 있다.
 
예)
Manifest-Version: 1.0
Main-Class: XXXXX  <== 실행할 클래스이름(main()이 꼭 있어야 됩니다.)
Class-Path: jcert.jar jsse.jar jnet.jar mm.jar <==필요한 classpath지정

jar cvfm 파일명.jar manifest.mf *.class