[java] jar 실행파일 만드는 법

initiative의 이미지

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

흠..이방법도 써보았지만 잘 안되더군요.

kslee80의 이미지

jar 생성 방법을 보니
manifest 파일에 Hello 대신에 JarTest.Hello 라고 적어줘야 할거 같네요.

asbubam의 이미지

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

initiative의 이미지

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!

rath의 이미지

---- MANIFEST.MF 파일 ------------
Manifest-Version: 1.0
Class-Path: JarTest/
Created-By: 1.4.2_04 (Sun Microsystems Inc.)
Main-Class: Hello

------------------------------------

Jar 파일 외부 클래스들이 필요하지 않다면 Class-Path 속성은 필요없습니다.
(잘못된 Class-Path가 있어도 문제가 되지는 않습니다)

Main-Class는 full qualified classname 을 적어주셔야 합니다.

---- MANIFEST.MF 파일 ------------
Manifest-Version: 1.0
Main-Class: JarTest.Hello
------------------------------------
initiative의 이미지

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!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.