[java] jar 실행파일 만드는 법
글쓴이: initiative / 작성시간: 화, 2004/09/14 - 5:49오후
jar 실행파일을 만들어 실행시키려고 합니다.
IDE 환경인 eclipse나 JBuilder 를 통하여 쉽게 jar 실행프로그램을 생성해내겠지만,직접 패키징하는 메커니즘을 알고싶은 거지요.
아래는 간단한 hello.jar 를 만든다고 하구요.
즉 D:\temp\test 에 manifest 파일이있고
D:\temp\test\JarTest 에 Hello.class, Hello.java --> Hello ~찍는 파일.
일단 manifest 파일을 만드는 것은 아래와 같이 만들었습니다.
Main-Class: Hello
-> 여기서 Hello 는 메인클래스이고 패키지를 쓰지 않았으며 manifest 파일 주의사항에 따라 한 줄 캐리지 리턴시킴.(cvfm 옵션 순서도 유의하여...)
그 다음 작업은 아래와 같이 수행하였습니다.
----- 실행 ---------------------------------------------- D:\temp\test>jar cvfm hello.jar manifest JarTest/ 추가된 manifest 추가 중: JarTest/(내부 = 0) (외부= 0)(0%가 저장되었습니다.) 추가 중: JarTest/Hello.class(내부 = 420) (외부= 288)(31%가 감소되었습니다.) 추가 중: JarTest/Hello.java(내부 = 107) (외부= 98)(8%가 감소되었습니다.) D:\temp\test>java -jar hello.jar Exception in thread "main" java.lang.NoClassDefFoundError: Hello D:\temp\test> -------------------------------------------------------------------
manifest 파일을 안만들고 하는 방법도 있던데.
http://bluemank.home.uos.ac.kr/moony_home/java/work/jar_dist.htm
흠..이방법도 써보았지만 잘 안되더군요.
Forums:


Re: jar 실행파일
jar 생성 방법을 보니
manifest 파일에 Hello 대신에 JarTest.Hello 라고 적어줘야 할거 같네요.
[code:1]jar -tvf hello.jar [/code:1]
jar -tvf hello.jar해보시면, jar 파일 내부의 JarTest/ 의 경로에 class 파일이 위치함을 알수 있습니다.
하지만 컴파일시에 JarTest 란 package 로 컴파일 된것이 아니기 때문에
Main-Class: JarTest.Hello하더라도, 실행은 되지 않습니다.
저같은 경우는, JarTest/ 의 위치에서 jar 를 묶었었는데
위에서처럼
jar 파일 내부의 JarTest/ 의 경로에 꼭 class 를 넣고 싶으실때는,
manifest 파일에
Class-Path: JarTest/를 추가해 주시면 될것 같습니다.ps. 잘 설명된 곳이 있어 링크합니다.
http://www-903.ibm.com/developerworks/kr/java/library/j-jar.html
Class-Path: JarTest/ 를 manifest 파일에 추
Class-Path: JarTest/
를 manifest 파일에 추가해주고 위의 작업을 수행한 결과입니다.
D:\temp\test>java -jar hello.jar Exception in thread "main" java.lang.NoClassDefFoundError: Hello (wrong name: Ja rTest/Hello) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:537) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12 3) at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) at java.net.URLClassLoader.access$100(URLClassLoader.java:55) at java.net.URLClassLoader$1.run(URLClassLoader.java:194) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)참고로 hello.jar 의 구성은 다음과 같으며
MANIFEST 파일을 열어본 결과입니다.
D:\temp\test>jar tvf hello.jar 0 Wed Sep 15 11:38:48 KST 2004 META-INF/ 90 Wed Sep 15 11:38:48 KST 2004 META-INF/MANIFEST.MF 0 Tue Sep 14 15:49:46 KST 2004 JarTest/ 420 Wed Sep 15 11:05:10 KST 2004 JarTest/Hello.class 107 Wed Sep 15 11:05:10 KST 2004 JarTest/Hello.java ---- MANIFEST.MF 파일 ------------ Manifest-Version: 1.0 Class-Path: JarTest/ Created-By: 1.4.2_04 (Sun Microsystems Inc.) Main-Class: Hello ------------------------------------입니다.
잘 안되네요..
With Everlasting Passion about new Tech. and Information!
[code:1]---- MANIFEST.MF 파일 ----------
Jar 파일 외부 클래스들이 필요하지 않다면 Class-Path 속성은 필요없습니다.
(잘못된 Class-Path가 있어도 문제가 되지는 않습니다)
Main-Class는 full qualified classname 을 적어주셔야 합니다.
rath 님이 말씀해주신 데로 하여 해결하였습니다.아래는 절차입니다.
rath 님이 말씀해주신 데로 하여 해결하였습니다.
아래는 절차입니다.
D:\temp\test>type manifest Main-Class: JarTest.Hello D:\temp\test>jar cvfm hello.jar manifest JarTest/ 추가된 manifest 추가 중: JarTest/(내부 = 0) (외부= 0)(0%가 저장되었습니다.) 추가 중: JarTest/Hello.class(내부 = 420) (외부= 288)(31%가 감소되었습니다.) 추가 중: JarTest/Hello.java(내부 = 107) (외부= 98)(8%가 감소되었습니다.) D:\temp\test>jar tvf hello.jar 0 Wed Sep 15 17:49:46 KST 2004 META-INF/ 98 Wed Sep 15 17:49:46 KST 2004 META-INF/MANIFEST.MF 0 Tue Sep 14 15:49:46 KST 2004 JarTest/ 420 Wed Sep 15 11:05:10 KST 2004 JarTest/Hello.class 107 Wed Sep 15 11:05:10 KST 2004 JarTest/Hello.java D:\temp\test>java -jar hello.jar Jar Test D:\temp\test>즉 manifest 파일을 수정하였습니다.
-C 이 옵션의 의미는 잘 모르겠더군요.
암튼 답변들이 달라 혼동되었으나 댓글주신 분들께 감사드립니다. :-)
아마 이런 방법외에 다른 방법이 있을 줄로 압니다.
With Everlasting Passion about new Tech. and Information!
댓글 달기