반응형

오늘은 Shell script를 이용해서 jar파일을 생성하는 글을 써 보려 한다.

 

eclipse에서도 export 도구를 통해서 jar파일을 생성할 수 있다. 하지만, 만약 eclipse와 같은 tool을 사용할 수 없다면, 어떻게 해야하나?

 

그렇다면 아래 방법대로 jar파일을 묶어서 관리할 수 있도록 하자. 순서는 다음과 같이 하도록 한다.

 

[1] jar파일 생성 순서

(1) classe path 디렉토리 이하 모든 class파일들을 삭제한다.

 

(2) ant build를 이용해서 다시금 classs 파일의 내용을 빌드한다.

 

(3) svn 을 사용중이라면 svn 관련파일을 모두 삭제한다.

 

(4) 컴파일된 class 파일만을 이용하여 jar파일을 묶는 작업을 실시한다.

 

[2] 실제 아래 소스를 보도록 하자.

 ** makejar.sh **

#! /bin/sh

 

rm -rf ../bin/*
echo "(1) Previous class file delete"

 

./dant
echo "(2) Recompile Success"

 

find ../bin -name *.svn -exec rm -rf {} \;
echo "<3> SVN FILE DELETE"

 

cd ../bin/

jar -cf ../shell/${1} ./com/
echo "<4> Make Jar File"

 

cd ../shell/

 

[3] 실행결과

$ ./makejar.sh aaaa.jar
(1) Previous class file delete
java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Client VM (build 20.5-b03, mixed mode)
Buildfile: D:\SVN\rndtech\KPU\Source\RUNA_API\shell\build.xml

RUNA_API:
    [javac] Compiling 9 source files to D:\SVN\rndtech\KPU\Source\RUNA_API\bin
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\collection\RBox.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\collection\RBoxList.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\collection\RLog.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\crypto\Base64.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\crypto\Crypto.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\exception\BizException.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\util\CommonMenu.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\util\CommonThumbnail.java
    [javac] D:\SVN\rndtech\KPU\Source\RUNA_API\src\com\runa\common\util\CommonUtil.java

BUILD SUCCESSFUL
Total time: 2 seconds
(2) Recompile Success
<3> SVN FILE DELETE
<4> Make Jar File 

 

위 예제를 보게 되면 [1] 의 순서와 맵핑이 되는 것을 알 수 있을 것이다. 저렇게 shell script를 작성해 두면

 

API 묶음을 만들때 아주 유용하게 써먹을 수 있다. ANT Build하는 방법에 대해서는 알아서 체크해보기 바란다.

 

 

                                                                              - 2012.08.27 랑이씀 -

반응형
반응형

Web System에서 윈도우의 도스명령어를 실행해야 하는경우가 있다.

 

예를들어, Database를 백업 또는 복구하는 경우에 이러한 기능이 매우 좋은 기능이다.

 

아래 소스를 보고 설명해 보자.

 

 

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

public class DosCommandExecute {

 public static void main(String args[]) {

  try {
   Scanner scan = new Scanner(System.in);
   System.out.print("INSERT DOS COMMAND :");
   String command = scan.next();

 

   String cmd[] = new String[3];
   cmd[0] = "cmd.exe";
   cmd[1] = "/C";
   cmd[2] = command;


   Runtime runTime = Runtime.getRuntime();
   Process process = runTime.exec(cmd);

 

   InputStream is = process.getInputStream();
   InputStreamReader isr = new InputStreamReader(is);
   BufferedReader br = new BufferedReader(isr);


   String line;

   while ((line = br.readLine()) != null) {
    System.out.println(line);
   }

   int execTime = process.waitFor();
   System.out.println("exectiog time: " + execTime);
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }

위 소스에 대해서 분석을 해보도록 하자.

 

우리가 입력하는 DOS명령어는 다음과 같은 형식이다.

 

cmd.exe /C (명령어)

 

/C는 다음과 같은 옵션이다.

(/C옵션)

/C      문자열이 지정한 명령어를 수행한 후에 종료합니다.

 

저 위의 명령어가 String 배열로 입력이 들어가는 것이다.

 

 

내부적으로 실행하는 방법은 Runtime Class를 이용하여 별도로 Thread를 이용하여 실행하는 방법이다.

 

원래 Java의 경우 Java 실행시 Runtime Class 실행하여 1개의 Thread를 생성한다, 내부적으로 Runtime Class를 하나 더 생성하여

 

도스명령어를 이용한 데이터를 가져온다.

 

이상이다. 만약 DB 백업 을 원하신다면 아래와 같이 데이터를 넣으면 쉽게 적용할 수있다.

 

 

   cmd[0] = "cmd.exe";
   cmd[1] = "/C";
   cmd[2] = "mysqldump -u root -papmsetup amt_db_oper > d:/견적서/하이루.sql"; 

 

그럼 깔끔하게 적용된다. 웹의 경우 Servlet에서 위와 같은 기능을 추가하게 된다면 많은 기능을 더 적용할 수 있을 것이다.

 

반응형
반응형
아~~~ 정말 오랜만에 글을 쓴다.

애기들 공부 가르키다가, 새롭게 기억이 쏙쏙 돛아나는 정규식~ 매번 공부해야겠다고 마음은 먹지만 못하는 이놈.ㅋㅋㅋ

정규식이란 놈은 골때린다. 그 이유인즉, Java, 기타 툴, DB 등등 각각의 엔진마다 조금씩 다르기 때문이다.

휴~~ 그래서 우선 Java에서 쓰이는 정규식만 정리를 해보도록 하자.

머 내가 정리한다기 보다는 Java API에 있는것들 어느정도 해석해서 적어보도록 하겠다.

테스트를 위해서는 아래 코드를 활용하면 쉽게 테스트 가능하다.


 public class Test {
 public static void main(String argsp[]) {

  String tmp = "0A가B1abc나2C32dd2ⓔ34DDD다d";

  for (int i = 0; i < tmp.length(); i++) {
   String tt = tmp.substring(i, i + 1);
   if (tt.matches("
\\p{Lower}")) {   // ==> 요기에 정규표현식을 섞어서 넣어주면 쉽게 테스트가능하다.
    System.out.println(tt);
   }
  }
 }
}


우선 Java에서 아주 쉽게 사용할 수 있는것 부터 소개 하도록 하겠다.

정규식에 대해서 기타 다른 프로그램도 동일하게 적용되는 부분이다. API에서는 이 부분을 "Predefined character classes"

라고 명명하였다.

[1] Predefined character classes

.       Any character                                                 : 어떤 문자든 . 으로 표현한다.
\d       A digit: [0-9]                            : 0부터 9까지의 숫자
\D       A non-digit: [^0-9]                       : 0~9까지의 숫자 가 아닌 것
\s       A whitespace character: [ \t\n\x0B\f\r]    : 띄워쓰기
\S       A non-whitespace character: [^\s]          : 띄워쓰기가 아닌문자
\w       A word character: [a-zA-Z_0-9]            : 대.소문자 영문자 + 숫자
\W       A non-word character: [^\w]               : (대.소문자 영문자 + 숫자) 가 아닌것

위의 Pattern은 모든 정규식에서 공통적으로 이용되는 정규식이기 때문에 외우두면 개발하기 매우 편하다.

다음으로 POSIX 에서 정의한 정규표현식을 알아보도록 하자. POSIX에서 정의한 정규표현식도 Java에서는 사용가능하다.

[2] POSIX character classes

\p{Lower} A lower-case alphabetic character: [a-z]                  : 영어 소문자
\p{Upper} An upper-case alphabetic character:[A-Z]                  : 영어 대문자
\p{ASCII} All ASCII:[\x00-\x7F]                                  : 아스키코드로 표현가능한 모든 문자
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]            : 모든 알파벳(대.소문자 포함)
\p{Digit} A decimal digit: [0-9]                                  : 0~9까지의 숫자
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]          : 알파뉴메릭(대.소문자 영문자 + 숫자)
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~    : 키보드로 표현가능한 특수문자
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]                : 알파뉴메릭 + 키보드로 표현가능한 특수문자
\p{Print} A printable character: [\p{Graph}\x20]                   : 알파뉴메릭 + 키보드로 표현가능한 특수문자
\p{Blank} A space or a tab: [ \t]                                 : 띄워쓰기 또는 Tab
\p{Cntrl} A control character: [\x00-\x1F\x7F]                     : 요건 나도 뭔지 잘 모름 ????
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]                         : 16진수로 표현가능한 문자
\p{Space}

A whitespace character: [ \t\n\x0B\f\r]                 : Tab , Enter, Carrige Return 문자



위의 POSIX Pattern 자체가 좀 더 눈으로 식별하기는 쉬운 느낌이 든다.

[1] 과 [2] 외에도 여러가지 정규 표현식 들이 존재한다.

하지만, 내 생각에는 [1]과 [2]의 표현식 정도면 외우고 있고 적당히 조합을 하면 왠만한 문자열 패턴을 찾는

것은 쉬울것이라 생각한다.



 마지막으로, 한글을 어떻게 하면 걸러낼 수 있을까? 라는 의문점이 든다. 모든 정규표현식은 한글이 아닌 US 문자를 기준

으로 구현되었기 때문에 한글의 경우는 과연 어떻게 할까?

우선 정답은 다음과 같다.


matches("[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]")

대략 보면 다음과 같다.

(1) 모든 한글은 ㄱ 으로 시작해서 ㅎ 으로 끝난다.
(2) 모든 모음은 ㅏ 로 시작해서 ㅣ 로 끝난다.
(3) (1)과 (2)을 모두 조합해 보았을때 모든 문자는 가 로 시작해서 힣 으로 끝이 난다.



정규표현식은 잘쓰면 복잡한 코드를 상당히 줄 일 수 있는 아주 유용한 표현식이다. 어느정도 익혀 놓는다면

개발자가 퀀텀점프 할 수 있는 좋은 계기가 될 것이라 생각한다.


                                                                                            - 2012.01.20 랑이씀 -


반응형

'Program > JAVA' 카테고리의 다른 글

ShellScript를 이용한 jar파일만들기  (0) 2012.08.09
JAVA에서 윈도우 명령어 실행하기  (0) 2012.06.14
[ Vector와 ArrayList의 차이점]  (2) 2010.11.22
POJO(Plain Old Java Object) 란?  (5) 2010.11.05
Abstract Class란?  (0) 2010.09.16
반응형
Vector를 사용하는 것이 좋은가? ArrayList를 사용하는것이 좋은가?

이런문제는 아주 기초적인 문제이지만, 정리를 하고 넘어가는 것이 추후 안까먹는것같다.

[1] List Interface 이하 Class들

List Interface를 구현한 Class 들은 다음과 같은것들이 있다. 그중 Vector 와 ArrayList는 아주 사용법도 비슷할 뿐더러 API 역시 매우 비슷하다. 아래그림을 보자.


[2] Vector와 ArrayList의 차이점

Vector 는 API를 보면 이러한 문구를 볼 수 있다. (
Synchronized, Thread-safe)
즉,, 동기화에 안전하다는 뜻이다. 과연 무슨뜻일까? 멀티스레드 프로그램의 경우, 별도 Syncronise 와 같은 Rock을 걸지 않아도 개별 스레드에서 사요되는 Vector의 요소에 타 Thread가 접근이 불가능하다는 뜻이다.

하지만 ArrayList의 경우 는 다음과 같다.(
Unsynchronized, unThread-safe)
이말은 즉, 동기화에 안전하지않다는 뜻이다. 즉 , 멀티스레드의 경우 타 스레드가 자신의 ArrayList 값을 수정가능 하다는 것이다.

[3] 수행속도의 차이점.

Vector의 경우 Thread 동기화가 되지 않기 때문에 매번 Thread마다 동기화를 초기화 하기 위해서 많은 메모리가 필요하고 그에따른 속도 저하가 발생한다.

하지만, ArrayList의 경우는 Vector의 경우보다 속도와 메모리 면에서는 훨씬 좋은 편이다.
capacity의경우도 Vector의 경우는 capacity > size 는 경우 현재 Capacity 만큼 증가하게 되지만, ArrayList의 경우는 50%의 capacity만큼 증가하게 된다.

[4] 결론

Multi- Thread가 아닌경우, ArrayList를 사용하는 것이 좋은 것 같다. 만약 멀티 Thread를 사용해야하는경우는 Vector를 사용하는 것보다는 ArrayList를 사용하고 만약 겹치는 부분에 대해 걱정이 된다면, DML의 경우
Synchronized 락을 거는 것이 좋은방법 인것 같다.


                                                                          - 2010.11.22 랑이씀 -


반응형

+ Recent posts