'Java'에 해당되는 글 23건

  1. 2009.01.13 개발관련 참고 URL
  2. 2009.01.12 jar 실행파일 만들기
  3. 2009.01.12 실행 가능한 자바 어플리케이션 JAR 배포 방법
  4. 2009.01.09 classpath 설정후 jar 묶는 방법
  5. 2009.01.09 SWT로 HelloSWT를 만들어 보자
  6. 2009.01.09 Eclipse Ganymede(3.4) Tutorial
  7. 2008.10.08 jsp에서 autoFlush 관련 확인 방법
  8. 2008.10.08 jsp 직접실행 막는 방법
  9. 2008.10.08 헥사 뷰어 만들기 예제
  10. 2008.10.08 한글 십육진수 상호 변환 예제
2009. 1. 13. 17:12

개발관련 참고 URL

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
 
 
 
2009. 1. 12. 09:57

실행 가능한 자바 어플리케이션 JAR 배포 방법

외부 Library를 사용한 Jar 실행시,

해당 Library를 classpath 환경변수에 추가해주거나
Java -classpath ... 등의 option을 주어서 실행해주어야하는 불편함이 있습니다.

결국 환경변수 추가 등의 선작업을 해주지 않으면 더블클릭만으로 실행할 수 없습니다.

Jar 패키징시 Class-Path: 옵션을 설정해줌으로써
위와 같은 작업들을 생략할 수 있습니다.

[실행가능한 자바 어플리케이션 JAR 배포 방법]

1. 해당 어플리케이션의 MANIFEST.MF를 작성하여 JAR 로 압축합니다.
   (Eclipse 및 Jar 명령어 사용)

2. MANIFEST.MF 의 내용은 다음과 같습니다.

Manifest-Version: 1.0
Class-Path: myapp-dependencies.jar etc.jar
Main-Class: org.myapp.Main

  - Class-Path: 부분에 사용되는 외부 Library를 기술할 것 (현재 패키징되는 Jar파일의 경로 기준)

3. Jawin, SWT의 DLL 사용으로 인해 java.library.path Property가 필요하다면

 - Main-Class main Method에 System.setProperty( "java.library.path", "[path goes here]" );로  Setting

이젠, 간단히 JAR를 더블클릭으로 실행이 가능하게 됩니다.


[참고 사이트]

JAR File Specification :
http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html  

Creating executable JAR :
http://www.javalobby.org/forums/thread.jspa?threadID=15486&tstart=0
http://www.javalobby.org/forums/thread.jspa?threadID=15512&tstart=0

[출처] : http://larky.tistory.com/45
2009. 1. 9. 17:57

classpath 설정후 jar 묶는 방법

-----------------------------------------------------------------------------------------------------
[질문]
이번에 학교 자바 수업에 Term Project로 프로그램을 하나 만들었습니다.
이 Project에 NetComponents-1.3.8.jar 파일을 받아와서 외부 jar파일 추가로 한뒤 작성을 했는데
다 완성하고 나서 Eclipse -> 파일 -> 내보내기로 해서 jar파일을 생성하면 저 NetComponents jar파일이 같이 묶이지
않아서 다른 컴퓨터에서 실행이 안됩니다.....
저 NetComponents도 같이 묶어서 배포파일을 만드는 방법좀 알려주셨으면 합니다.
-----------------------------------------------------------------------------------------------------
[답변]

WAR 또는 JAR 안에

META-INF/MANIFEST.MF 를 만듭니다.

Manifest-Version: 1.0
Class-Path: ./lib/NetComponents-1.3.8.jar

2009. 1. 9. 17:53

SWT로 HelloSWT를 만들어 보자

2009. 1. 9. 17:08

Eclipse Ganymede(3.4) Tutorial

Eclipse Ganymede(3.4) Tutorial
내용 : 이클립스 사용방법

출처 : http://cafe.naver.com/onjava/1927

2008. 10. 8. 15:21

jsp에서 autoFlush 관련 확인 방법

<%@ page buffer="9kb" autoFlush="true"%>
<%System.out.println("out.getBufferSize() : "+out.getBufferSize());%>
<%System.out.println("out.getRemaining() : "+out.getRemaining());%>
2008. 10. 8. 15:19

jsp 직접실행 막는 방법

spring 이나 struts 같은 프레임웍은 jsp 의 처리를 컨트롤러에 위임하게 된다.

그래서 *.do 같은 형태의 url 로 접근 하도록 만들어 놓은건데.

좀 똑똑한 사용자가 jsp 파일의 경로를 알아서 컨트롤러를 거치지 않고

바로 jsp 에 접근하는게 가능하다.

이것을 막기위해 web.xml 에다가 아래 코드를 추가하면 된다.


 <security-constraint>
  <display-name>JSP Protection</display-name>
  <web-resource-collection>
   <web-resource-name>SecureJSPPages</web-resource-name>
   <url-pattern>*.jsp</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>nobody</role-name>
  </auth-constraint>
 </security-constraint>
 
 <security-role>
  <description>
  Nobody should be in this role so JSP files are protected
  from direct access.
  </description>
  <role-name>nobody</role-name>
 </security-role>


2008. 10. 8. 15:19

헥사 뷰어 만들기 예제

자바로, 헥사 뷰어를 만드는 소스 코드입니다. 파일을 이진모드로 열어서, 16바이트씩 읽어 헥사(16진수)로 변환한 후, 출력합니다.

복잡한 기능은 없고 최대한 간단하게 만든 것입니다. 헥사 뷰어라는 것은, 이상하게도, 조그만 기능 하나만 추가해도, 상당히 복잡하게 되는 측면이 있습니다.


헥사 뷰어 만들기 소스 코드

소스 파일명: Example.java
버전 0.8
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
import java.io.*;

public class Example {
  public static void main(String[] args) throws IOException {

    if (args.length == 0) { // args.length 는 옵션 개수
      System.err.println("Input Filename...");
      System.exit(1); // 읽을 파일명을 주지 않았을 때는 종료
    }

    byte[] buf16 = new byte[16]; // 헥사 값이 16바이트씩, 즉, 한줄씩 저장될 버퍼
    int offset = 0; // 번지
    int buf16Len;   // 한줄에 들어있는 헥사 값의 개수, 즉, 길이
    DataInputStream in = new DataInputStream(new FileInputStream(args[0]));

    while ((buf16Len = in.read(buf16)) > 0) {
      System.out.format("%08X:  ", offset); // Offset (번지) 출력

      // 헥사 구역의 헥사 값 16개 출력 (8개씩 2부분으로)
      for (int i = 0; i < buf16Len; i++) {
        if (i == 8) System.out.print(" ");    // 8개씩 분리
        System.out.format("%02X ", buf16[i]); // 헥사 값 출력
      }

      // 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
      for (int i = 0; i <= (16 - buf16Len) * 3; i++)
        System.out.print(" ");
      if (buf16Len < 9) System.out.print(" "); // 한줄이 9바이트보다 적을 때는 한칸 더 삽입


      // 문자 구역 출력
      for (int i = 0; i < buf16Len; i++) {
        if (buf16[i] >= 0x20 && buf16[i] <= 0x7E) // 특수 문자 아니면 출력
          System.out.format("%c", buf16[i]);
        else System.out.print("."); // 특수문자, 그래픽문자 등은 마침표로 출력
      }

      offset += 16; // 번지 값을 16 증가
      System.out.println(); // 줄바꿈
    }

    if (offset == 0) System.out.format("%08X:  ", offset); // 0바이트 파일일 경우 처리
    in.close();
  }
}
컴파일 및 실행 결과 화면:
D:\Z>javac Example.java

D:\Z>java Example
Input Filename...

D:\Z>java Example test.bin
00000000:  4D 5A 90 20 03 20 20 20  04 20 20 20 FF FF 20 20  MZ. .   .   ..
00000010:  B8 20 20 20 20 20 20 20  40 20 20 20 20 20 20 20  .       @
00000020:  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20
00000030:  20 20 20 20 20 20 20 20  20 20 20 20 D0 20 20 20              .
00000040:  0E 1F BA 0E 20 B4 09 CD  21 B8 01 4C CD 21 54 68  .... ...!..L.!Th
00000050:  69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F  is program canno
00000060:  74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20  t be run in DOS
00000070:  6D 6F 64 65 2E 0D 0D 0A  24 20 20 20 20 20 20 20  mode....$
00000080:  64 C7 F9 7C 20 A6 97 2F  20 A6 97 2F 20 A6 97 2F  d..| ../ ../ ../
00000090:  E3 A9 CA 2F 23 A6 97 2F  20 A6 96 2F 77 A6 97 2F  .../#../ ../w../
000000A0:  07 60 EA 2F 30 A6 97 2F  07 60 FA 2F 49 A6 97 2F  .`./0../.`./I../
000000B0:  07 60 F9 2F 02 A6 97 2F  07 60 EF 2F 21 A6 97 2F  .`./.../.`./!../
000000C0:  52 69 63 68 20 A6 97 2F  20 20 20 20 20 20 20 20  Rich ../
000000D0:  50 45 20 20 4C 01 03 20  B8 E3 22 46 20 20 20 20  PE  L.. .."F
000000E0:  20 20 20 20 E0 20 03 01  0B 01 08 20 20 B0 20 20      . .....  .
000000F0:  20 50 20 20 20 20 20 20  CF 1C 20 20 20 10 20 20   P      ..   .
00000100:  20 C0 20 20 20 20 40 20  20 10 20 20 20 10 20 20   .    @  .   .
00000110:  04 20 20 20 20 20 20 20  04 20 20 20 20 20 20 20  .       .
00000120:  20 10 01 20 20 10 20 20  20 20 20 20 03 20 20 20   ..  .      .
00000130:  20 20 10 20 20 10 20 20  20 20 10 20 20 10 20 20    .  .    .  .
00000140:  20 20 20 20 10 20 20 20  20 20 20 20 20 20 20 20      .
00000150:  94 D8 20 20 28 20 20 20  20 20 20 20 20 31 31 31  ..  (        111
00000160:  30                                                0

D:\Z>
D:\Z>java Example test.bin > out.txt

D:\Z>
java Example test.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.

2008. 10. 8. 15:17

한글 십육진수 상호 변환 예제

자바는 기본적으로 유니코드를 사용하기에 한글을 다루기에도 편리합니다. 다음과 같은 방법을 사용하면 한글을 16진수 헥사로 상호 변환할 수 있습니다. 단, 여기서의 16진수 코드는 "유니코드 코드 번호"입니다. 한글 완성형의 16진수 코드와는 다릅니다.


한글 <-> 십육진수 바꾸기 (상호 변환)

예제 소스 파일명: Example.java
public class Example {
  public static void main(String[] args) {


    // 한글을 16진수로 변환 출력
    System.out.format("%04X%n", (int) '가');
    // 출력 결과: AC00


    // 16진수를 한글로 변환 출력
    System.out.format("%c%n", (char) 0xAC00);
    // 출력 결과: 가


    // 출력 결과를 화면이 아닌 변수에 저장하여 완전 변환 방법
    String s = String.format("%c", (char) 0xAC00);
    System.out.println(s);
    // 가

  }
}