'Java'에 해당되는 글 23건
- 2009.01.13 개발관련 참고 URL
- 2009.01.12 jar 실행파일 만들기
- 2009.01.12 실행 가능한 자바 어플리케이션 JAR 배포 방법
- 2009.01.09 classpath 설정후 jar 묶는 방법
- 2009.01.09 SWT로 HelloSWT를 만들어 보자
- 2009.01.09 Eclipse Ganymede(3.4) Tutorial
- 2008.10.08 jsp에서 autoFlush 관련 확인 방법
- 2008.10.08 jsp 직접실행 막는 방법
- 2008.10.08 헥사 뷰어 만들기 예제
- 2008.10.08 한글 십육진수 상호 변환 예제
개발관련 참고 URL
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
실행 가능한 자바 어플리케이션 JAR 배포 방법
해당 Library를 classpath 환경변수에 추가해주거나
Java -classpath ... 등의 option을 주어서 실행해주어야하는 불편함이 있습니다.
결국 환경변수 추가 등의 선작업을 해주지 않으면 더블클릭만으로 실행할 수 없습니다.
Jar 패키징시 Class-Path: 옵션을 설정해줌으로써
위와 같은 작업들을 생략할 수 있습니다.
[실행가능한 자바 어플리케이션 JAR 배포 방법]
1. 해당 어플리케이션의 MANIFEST.MF를 작성하여 JAR 로 압축합니다.
(Eclipse 및 Jar 명령어 사용)
2. MANIFEST.MF 의 내용은 다음과 같습니다.
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
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
SWT로 HelloSWT를 만들어 보자
Eclipse Ganymede(3.4) Tutorial
jsp에서 autoFlush 관련 확인 방법
<%System.out.println("out.getBufferSize() : "+out.getBufferSize());%>
<%System.out.println("out.getRemaining() : "+out.getRemaining());%>
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>
헥사 뷰어 만들기 예제
자바로, 헥사 뷰어를 만드는 소스 코드입니다. 파일을 이진모드로 열어서, 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 라는 파일로 출력 결과가 저장됩니다.
한글 십육진수 상호 변환 예제
자바는 기본적으로 유니코드를 사용하기에 한글을 다루기에도 편리합니다. 다음과 같은 방법을 사용하면 한글을 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);
// 가
}
}