'JAR'에 해당되는 글 2건
- 2009.01.16 jar파일에서 외부 패키지 사용하기
- 2009.01.12 jar 실행파일 만들기
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를 설정하는 방법
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
jar 파일 생성하기
jar <option> <target_file> <src_files>
jar cvf JavaAmp.jar myprojects
manifest 파일 수정하기
java -jar JavaAmp.jar
Main-Class: myprojects.javaamp.JavaAmp
jar umf Manifest.mf JavaAmp.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