http://blog.naver.com/lsy94307/140021287246
출처 : http://blog.empas.com/ahnyounghoe/12332593
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
http://blog.naver.com/lsy94307/140021287246
출처 : http://blog.empas.com/ahnyounghoe/12332593
Ant 의 최신의 안정판은 Ant 의 홈 페이지 http://jakarta.apache.org/ant/ 에서 다운로드 가능합니다. 마지막 버전을 좋아하는 분은, http://jakarta.apache.org/builds/ant/nightly/ 에서 가장 최신판을 다운로드할 수 있습니다.
원본을 갖고 싶다면, http://jakarta.apache.org/builds/ant/release/v1.5.1/src/ 에서 Ant 의 최신 릴리즈의 소스를 다운로드할 수 있습니다. 반복이 됩니다만, 마지막 버전을 구하고 싶다면, CVS 를 통해서 개발되고 있는 코드에 액세스 가능합니다. Jakarta 의 웹 사이트에서, CVS에의 액세스에 대해 자세하게 알 수 있습니다. jakarta-ant 모듈을 체크아웃 해 주세요. 소스 코드로부터 Ant 를 빌드 하는 방법에 대해서는, Ant 빌드하기 의 부분을 참조하세요. Ant CVS 창고에도 온라인으로 접근가능합니다.
Ant 를 빌드 해 사용하려면, 당신의 클래스 패스에 JAXP 호환의 XML 파서가 인스톨되어 이용 가능해야 합니다.
Ant 의 실행본 제품은, Apache Xerces2 XML 파서의 최신판이 포함되어 있습니다. JAXP 에 대한 자세한 정보는 http://java.sun.com/xml/ 을 봐 주세요. JAXP 호환의 다른 파서를 사용하고 싶은 경우에는, Ant의 lib
디렉토리로부터 xercesImpl.jar
및 xml파서APIs.jar
를 삭제해 주세요. 그리고, 당신 취향의 파서로부터 그 jar 파일들을 Ant 의 lib디렉토리에 넣어두든지 아니면, jar 파일들을 시스템 클래스패스로 잡으시기 바랍니다.
현재 버전의 Ant는, 버전 1.1 이상의 JDK 가 인스톨되는 것을 요구합니다. 어떤 태스크는 1.1 이상의 시스템에서 잘 작동합니다; 어떤 태스크는 Java 1.2 및 그 계열에서만 작동합니다. Ant 1.x 에서는 1.1 의 호환성을 유지하도록 계속 노력합니다만, Ant 의 장래의 버젼 -Ant 2.0- 에서는 JDK 1.2 이상을 요구사항으로 할 예정입니다.
주의: MS 컴파일러는 지원하고 있습니다만, Microsoft JVM/JDK 만으로는 적절하지는 않습니다.
주의 #2: 만약 JDK 가 없는 JRE runtime 만으로는, 많은 태스크는 동작하지 않습니다.
Ant 의 실행본 배포판은 다음과 같은 디렉토리로 구성되어 있습니다:
ant +--- bin // 실행 스크립트가 있습니다 | +--- lib // Ant jar 들과 필요한 의존파일이 있습니다 | +--- docs // 문서가 있습니다 | +--- ant2 // Ant2 의 요구사항의 간단한 설명 | | | +--- images // HTML 문서용의 여러가지 로고 | | | +--- manual // Ant 의 문서(반드시 읽어 주세요 ;-) | +--- etc // xsl 툴이 있습니다 // - 여러가지 태스크의 xml 출력으로부터, 보다 좋은 리포트를 작성합니다 // - 빌드 파일을 통합해, 'deprecated'의 경고를 없앱니다 // - ... 게다가 그 밖에도 ;-)Ant 를 실행하려면
bin
및 lib
디렉토리만이 필요합니다. 인스톨 하려면 , 어느 디렉토리를 선택해, 배포 파일을 거기에 카피합니다. 이 디렉토리는 ANT_HOME 이 됩니다.
Windows 95 및 Windows 98 상에서의 주의사항: | |
이러한 시스템상에서는, ANT_HOME 이 긴 파일명일 경우, Ant 를 기동하는데 사용되는 스크립트에 문제가 발생합니다. 이것은, OS의 배치파일의"for" 문의 제한에 의하는 것입니다. 따라서, Ant 를 C:\Ant 처럼 짧은 path 에 인스톨 하는 것을 추천 합니다. |
Ant 를 실행하기 전에, 필요한 몇개의 추가의 설정이 있습니다:
ANT_H
OME
을 Ant 를 인스톨된 장소의 디렉토리로 설정합니다. 일부의 운영체제에서는, Ant 의 wrapper 스크립트들을 ANT_HOME
로 추측합니다 (Unix 계열이나 Windows NT/2000) - 그러나, 이 방법은 의지하지 않는 편이 좋을 것입니다. JAVA_HOME
을 설정합니다. (아래의 고급자용 부분에서 봐 주세요.) 이것에는 JDK가 인스톨 된 장소의 디렉토리로 설정합니다. 주의: Ant 의 ant.jar 파일을 JDK/JRE 의 lib/ext 디렉토리에 인스톨 하지 말아 주세요. Ant 는 애플리케이션입니다만, extension 디렉토리는 JDK 의 확장기능을 위한 영역이기 때문입니다. 특히, extension 에 의해 로드 되는 클래스에는 보안영역의 제한이 있습니다.
Ant 는 몇 개의 옵션 태스크를 제공하고 있습니다. 옵션 태스크는 외부 라이브러리를 필요로 하는 전형적인 태스크입니다. 옵션 태스크는 Ant 의 Core 태스크와 함께 패키지되어 있습니다.
개개의 옵션 태스크로 필요한 외부 라이브러리는 라이브러리 의존관계의 영역에서 자세하게 진술되고 있습니다. 이러한 외부 라이브러리는 자동적으로 꺼내지는 Ant 의 lib 디렉토리에 두는지 또는, 시스템 환경 변수 CLASSPATH 로 사용할 수 있도록 만듭니다.
Ant 가 c:\ant\
에 인스톨 되고 있다고 가정하고, 다음의 환경대로 설정합니다:
set ANT_HOME=c:\ant set JAVA_HOME=c:\jdk1.2.2 set PATH=%PATH%;%ANT_HOME%\bin
Ant 가 /usr/local/ant
에 인스톨 되고 있다고 가정하고, 다음의 환경대로 설정합니다:
export ANT_HOME=/usr/local/ant export JAVA_HOME=/usr/local/jdk-1.2.2 export PATH=${PATH}:${ANT_HOME}/bin
setenv ANT_HOME /usr/local/ant setenv JAVA_HOME /usr/local/jdk-1.2.2 set path=( $path $ANT_HOME/bin )
Ant 를 실행하는데는 여러가지 방법이 있습니다. 최소한의 필요한 일은 다음과 같습니다:
ant.jar
와, 선택된 JAXP 호환 XML 파서에 필요한 jars/클래스들이 포함되어야합니다. classes.zip
파일을 클래스 패스에 추가해야 합니다; JDK 1.2 나 JDK 1.3 에서는 tools.jar
을 반드시 추가해야 합니다. Ant 와 함께 제공되는 bin
디렉토리에 있는 스크립트는, 환경 변수 JAVA_HOME
가 설정되어 있는 경우, 필요한 JDK 클래스를 자동적으로 추가합니다. ant.home
을 Ant 를 인스톨 한 디렉토리로 설정해야 됩니다. 반복이 됩니다만, 이것은 Ant 의 스크립트에 의해 환경 변수 ANT_HOME 의 값으로 설정됩니다. Ant 를 소스로부터 빌드 하려면, Ant 소스 배포판을 인스톨 하거나, CVS 로부터 jakarta-ant 모듈을 체크아웃 할 수도 있습니다.
소스를 인스톨 하려면, 인스톨 디렉토리로 이동합니다.
환경 변수 JAVA_HOME
를 JDK 가 인스톨 된 디렉토리로 설정합니다. 자신의 운영체제로, 이것을 실시하는 방법에 대한 예는 Ant 설치하기를 참조하세요.
자신의 흥미가 있는 태스크를 빌드 하는데 필요한 추가의 jar 를 다운로드했는지 확인합니다. 이것들은, CLASSPATH 상에 두거나 또는, lib
디렉토리에 추가하는 것으로 이용 가능해집니다. 여러가지 기능으로 필요한 jar 의 일람은 라이브러리 의존관계를 봐 주세요. 이것의 추가의 jar 파일은 오직 Ant 의 빌드로만 이용 가능하다는 것에 주의하기 바랍니다. Ant 를 실행하려면 , Ant 설치하기 에서 진술되고 있는 일에 따라 jar 를 사용가능하게 해야 합니다.
여기, Ant 를 빌드 할 준비가 갖추어졌습니다:
build -Ddist.dir=<directory_to_contain_Ant_distribution> dist
(Windows)
build.sh -Ddist.dir=<directory_to_contain_Ant_distribution> dist
(Unix)
이것에 의해, 지정한 디렉토리에 Ant 의 실행본 배포판을 생성합니다.
위의 조작은 다음 일을 실시합니다:
build.xml
파일을 "dist" 타겟으로 지정합니다. 많은 경우는, 빌드 스크립트가 주므로, 명시적으로 Ant 를 부트스트랩(bootstrap)을 실시할 필요는 없을 것입니다. 그렇지만, 사용하고 있는 빌드 파일이, 부트스트랩(bootstrap)된 Ant 로 아직 컴파일되어 있지 않은 기능을 사용하는 경우, 수동으로 부트스트랩(bootstrap)할 필요가 있습니다. Ant 의 새로운 부트스트랩(bootstrap)판을 빌드 하려면, bootstrap.bat
(Windows) 혹은 bootstrap.sh
(UNIX) 를 실행합니다.
ANT_HOME
에 빌드 된 것을 인스톨 하고 싶은 경우에는, 다음을 사용할 수 있습니다:
필요하면, 시간이 걸리는 javadoc 생성 과정을 생략 할 수가 있습니다:
build install
(Windows)
build.sh install
(Unix)
이것은
build install-lite
(Windows)
build.sh install-lite
(Unix)
bin
및 lib
디렉토리만을 인스톨 합니다.
install
및 install-lite
타겟은 양쪽 모두 ANT_HOME
에 있는 현재의 버젼의 Ant 를 덧쓰기합니다.
다음에 나타나는 기능을 사용하는 경우에는, 다음의 라이브러리가 CLASSPATH, 혹은, 인스톨 디렉토리안의 lib
디렉토리에 추가되어야 합니다. mapper 로 사용하기 위해서는, regexp 라이브러리의 한 부분이 필요하다는 것에 주의하세요. 이러한 태스크를 이용 가능하게 하려면, 그 태스크의 정의가 포함된 Ant 옵션 jar 파일을 인스톨해야 합니다.. 자세한건 Ant 설치하기 / 옵션 태스크 부분를 참조해 주세요.
Jar 이름(Jar Name) | 필요로 하는 태스크(Needed For) | 배포 되는 곳(Available At) |
An XSL transformer like Xalan or XSL:P | style task | Xalan을 구할수 있는 곳 http://xml.apache.org/xalan-j/index.html. http://www.clc-marketing.com/xslp/ 에서 XSL:P 을 배포합니다, 하지만 이 링크는 더이상 작동하지 않고 우리는 이곳을 대체할 만한 사이트를 구하지 못했습니다. |
jakarta-regexp-1.2.jar | regexp type with mappers | jakarta.apache.org/regexp/ |
jakarta-oro-2.0.4.jar | regexp type with mappers and the perforce tasks | jakarta.apache.org/oro/ |
junit.jar | junit tasks | www.junit.org |
xalan.jar | junitreport task | xml.apache.org |
stylebook.jar | stylebook task | CVS repository of xml.apache.org |
testlet.jar | test task | java.apache.org/framework |
antlr.jar | antlr task | www.antlr.org |
bsf.jar | script task | oss.software.ibm.com/developerworks/projects/bsf |
netrexx.jar | netrexx task | www2.hursley.ibm.com/netrexx |
js.jar | javascript with script task | www.mozilla.org/rhino |
jpython.jar | python with script task | www.jpython.org |
jacl.jar and tcljava.jar | TCL with script task | www.scriptics.com/java |
BeanShell JAR(s) | BeanShell with script task | www.beanshell.org |
netcomponents.jar | ftp and telnet tasks | www.savarese.org/oro/downloads |
bcel.jar | classfileset data type, JavaClassHelper used by the ClassConstants filter reader and optionally used by ejbjar for dependency determination | jakarta.apache.org/bcel/ |
mail.jar | Mail task with Mime encoding, and the MimeMail task | http://java.sun.com/products/javamail/ |
activation.jar | Mail task with Mime encoding, and the MimeMail task | http://java.sun.com/products/javabeans/glasgow/jaf.html |
jdepend.jar | jdepend task | http://www.clarkware.com/software/JDepend.html |
Copyright © 2000-2002 Apache Software Foundation. All rights Reserved.
번역: 성백재, contact: soma815@msn.com http://jspmaster.com
http://www.apache-korea.org , jakarta-seoul project
Jakarta Ant
-. 이번 강좌에서는 지난 시간에 이어 ant 사용에 필수적인 task들에 대해 알아보고
예제를 통해 한번더 알아보도록 하겠습니다.
만약 지난 강좌를 아직 보지 않았다면 다음 링크를 참조하세요
http://www.jakartaproject.com/article/jakarta/1114617006525
I. 집합 태그
1. <fileset>
①개요
-. fileset이란 말 그대로 파일의 집합을 말하며 특정 태스크에서 파일을 포함하여야 할때
손쉽게 특정 파일이나 집합을 지정해 주는데 사용된다
주로 클래스패스나, 압축, 파일 카피등의 task에서 사용되어진다
②예제
사용예제-1
모든 디렉토리의 java파일을 포함시키면서 파일이름중 Test가 들어가는 파일은 제외하는 fileset을 나타낸다
위 세가지 fileset은 같은 의미이다
사용예제-2
","를 사용하여 나타낼 수도 있고 다로 분리하여 tag를 사용할 수도 있다
위 두 fileset은 같은 의미이다
③ 속성
속성 | 설명 | 필수여부 |
dir | 파일집합의 최상위 디렉토리 (루트 디렉토리) | dir나 file둘중 하나는 필수 |
file | 특정 하나의 파일을 지정할때 사용 | |
defaultexcludes | default excludes 에 명시된 파일 및 디렉토리를 자동적으로 제외하는 속성이며 이기능을 사용하려면 생략한다. 혹은 yes/no 로 값을 준다 | No |
includes | 컴마나 스페이스로 구분된 파일의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 파일을 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 파일의 패턴을 제외하는 속성이며 생략하면 default excludes를 제외하고 어떠한 파일도 제외하지 않는다 | No |
excludesfile | 특정 각각의 파일을 제외할때 사용하는 속성 | No |
casesensitive | 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 | No |
followsymlinks | symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 | No |
excludes를 사용하지 않아도 기본적으로 제외되는 파일 및 디렉토리
자 이정도면 fileset은 이제 빠~삭해 지셨겠죠?
2. <dirset>
① 개요
-. fileset이 파일 집합을 나타냈다면 dirset task는 디렉토리의 집합을 나타낸다. 기본적인 속성은 fileset과 동일하다
차이점은 defaultexcludes가 없다
② 사용예제
apps 이하 디렉토리중 classes 디렉토리를 포함하고 apps 이하 디렉토리중 디렉토리 이름중 Test가 들어가는 디렉토리는 제외한 dirset을 의미한다
③ 속성
속성 | 설명 | 필수여부 |
dir | 파일집합의 최상위 디렉토리 (루트 디렉토리) | YES |
includes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 디렉토리를 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 특정 각각의 디렉토리를 제외할때 사용하는 속성 | No |
casesensitive | 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 | No |
followsymlinks | symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 | No |
3. <patternset>
① 개요
-. 여러 파일이나 디렉토리를 미리 그룹핑해 놓고 이를 특정 아이디를 통해 사용하는 방식을 제공한다. 즉 워드의 매크로 같은 기능이라 보면 쉽게 이해가 갑니다
② 사용예제
예제를 보는바와 같이 patternset은 여러곳에서 동일한 패턴을 사용할때 이를 미리 정의해 놓고 지정한 id의 값을 refid를 통해 재사용 할 수 있다
paternset을 사용하면 코딩양을 줄일 수 있고 변동사항이 있으면 손쉽게 변동 할 수 있다는 점이다
③ 속성
속성 | 설명 | 필수여부 |
includes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 특정 각각의 디렉토리를 포함할때 사용하는 속성 | No |
excludes | 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 특정 각각의 디렉토리를 제외할때 사용하는 속성 | No |
4. <path>
① 개요
-. 파일과 디렉토리를 함께 나타낼 수 있는 집합. 클래스패스에는 경로뿐만 아니라 *.jar 같은 파일이 같이 사용되듯이 이 path task는 주로 클래스패스로 자주 이용된다
fileset, dirset과 비슷하지만 파일과 디렉토리를 함께 나타낼 수 있다는 점에서 틀리다
path tag역시 patternset과 같이 지정된 id 값을 이용하여 여러 곳에서 재사용 할 수 있다.
② 사용예제
아래 예제는 ${basedir}/lib/struts.jar, ${base.dir}/lib/log4j.jar 그리고 ${base.dir}/classes 에 클래스패스를 잡는 예제이다.
path에 대한 정의를 해놓고 base.path라는 아이디를 이용하여 여러 곳에서 사용할 수 있다
II. 파일 태그
1. <copy>
① 개요
-. 소스 파일을 타겟으로 파일을 복사하는데 사용한다
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
file | 복사할 파일 | fileset tag를 사용하지 않는다면 필수 |
preservelastmodified |
소스와 타겟의 최종 수정날짜 파일을 유지하며 복사한다 기본값은 false |
No |
tofile | 복사할 소스파일 | fileset tag와 함께 소스 및 타겟을 지정할수있다 |
todir | 복사할 소스 디렉토리 | |
overwrite | 타겟의 파일이 최근의 파일이라도 덮어쓸지 여부를 나타내며 기본값은 false | No |
filtering |
복사하는동안 filter를 사용할것인지 여부를 나타내며 기본값은 false 단 이 값이 false일지라도 nested 하게 <filterset>을 사용할수 있다 |
No |
flatten |
소스 디렉토리의 구조를 무시하고 특정 디렉토리 한곳에 모든 파일을 복사할지 여부를 나타내며 기본값은 false |
No |
includeEmptyDirs |
<fileset>을 지정하여 복사될 디렉토리중에 파일이 없는 비어있는 디렉토리까지 복사할지 여부를 나타내며 기본값을 true |
No |
failonerror |
복사중 에러가 발생할때 false이면 warning 메세지 로그를, 그렇지 않으면 build시 중지한다 기본값은 true |
No |
verbose | 복사되고 있는 파일의 로그 여부를 나타내며 기본값은 false | No |
encoding |
필터 복사중 사용할 encoding을 나타내며 기본값은 JVM 기본 encoding을 따른다 (ant 1.5 이후) |
No |
outputencoding |
파일기록에 사용할 encoding을 나타낸다 (ant 1.6이후) |
No |
enablemultiplemappings |
true면 주어진 소스 path에대해 모든 mapping 처리를 하며 false이면 첫번째 파일이나 디렉토리에 대해서만 mapping 처리를 한다 이 속성은 <mapper> subelement가 있을때만 관련있다 기본값은 false (ant 1.6이후) |
No |
granularity |
최근 수정된 시간을 기준으로 파일을 비교 복사시 기준이 되는 시간으로부터 여유분 시간을 나타낸다 즉 소스 파일 서버와 타겟 파일 서버가 다른경우 두 머신간에 시간차이가 있을 수 있기 때문에 이를 사용한다 (ant 1.6.2 이후) |
2. <delete>
① 개요
-. 하나의 파일, 하나의 디렉토리 혹은 fileset으로 지정한 특정한 파일들을 삭제할수 있다
② 사용예제
③ 속성
속성 | 설명 | 필수사항 |
file |
삭제할 파일 (상대경로나 절대경로나 상관없음) |
<fileset>을 사용하지 않는다면 file혹은 dir둘중 하나는 사용하여야 한다 |
dir |
삭제할 디렉토리 | |
verbose |
각 삭제되는 파일의 이름을 보져줄 것인지 여부를 나타내며 기본값은 false |
No |
quiet |
시스템이 사용하고 있어 삭제할수 없는 파일이거나 존재하지 않는 파일, 디렉토리등의 메세지를 나태낼지 여부를 나타내며 기본값은 false |
No |
failonerror |
파일 삭제시 에러가 발생하면 build를 중단 하고 현재 사항을 레포팅해줄지 여부를 나타내며 기본값은 true |
No |
includeemptydirs | fileset을 사용할 때 빈 디렉토리empty directory)를 삭제할 것인지 여부를 나타내며 기본값은 false | No |
includes | Deprecated. Use <fileset> . |
No |
includesfile | Deprecated. Use <fileset> . |
No |
excludes | Deprecated. Use <fileset> . |
No |
excludesfile | Deprecated. Use <fileset> . |
No |
defaultexcludes |
Deprecated. Use 기본값은 true |
No |
deleteonexit |
파일 삭제시 실패했을때 JVM이 종료될 때 이 파일을 지우도록 할것인지 여부를 나타내며 기본값은 false (ant 1.6.2 이후) |
No |
3. <mkdir>
① 설명
-. 디렉토리를 생성
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
dir | 생성할 디렉토리 | Yes |
4. <move>
① 설명
-. 파일 혹은 디렉토리를 타겟으로 이동시킵니다 디폴트로 타겟에 이미 파일이 존재하면 덮어씁니다.
② 사용예제
③ 속성
-. delete 속성과 동일합니다
III. java 태그
1. <javac>
① 설명
-. 자바소스를 컴파일 하는 tag입니다
기본적으로 타겟에 특정 .java에 대해 .class 파일이 없거나 오래된 .class 파일이면 컴파일 대상입니다
② 사용예제
③ 속성
width=20%>속성 | 설명 | 필수여부 |
srcdir | 자바 소스가 위치한 디렉토리 |
Yes
|
destdir | 컴파일된 클래스파일이 위치할 디렉토리 | No |
includes | 컴마나 스페이스로 구분된 파일집합의 패턴을 포함하여 컴파일하며 모든 파일을 사용하려면 생략한다 | No |
includesfile | 각각 개개의 파일을 포함하여 컴파일 | No |
excludes | 컴마나 스페이스로 구분된 파일의 패턴을 제외하하여 컴파일하며 생략하면 어떠한 디렉토리도 제외하지 않는다 | No |
excludesfile | 각각 개개의 파일을 제외하여 컴파일 | No |
classpath | 사용할 클래스 패스 | No |
sourcepath |
사용할 소스패스이며 기본값은 srcdir 값이다 |
No |
bootclasspath | bootstrap 클래스 패스 | No |
classpathref | 참조를 통해 사용할 클래스 패스 (refid를 이용한 path 태그) | No |
sourcepathref | 참조를 통해 사용할 소스 패스 | No |
bootclasspathref | 참조를 통해 사용할 bootstrap 패스 | No |
extdirs | 사용할 extednsion이 위치한 경로 (${java_home}/lib/ext/를 말하는것 같음) | No |
encoding | 소스파일에 사용할 encoding (javac의 -encoding과 동일) | No |
nowarn |
컴파일시 -nowarn 옵션을 을 줄지 여부를 나타내며 기본값은 off 반대값은 on |
No |
debug | 컴파일시 debug 모드로 컴파일 하며 기본값은 off | No |
optimize | 컴파일시 optimize 옵션을 사용한다 기본값은 off | No |
deprecation | 컴파일시 deprecation 옵션을 사용한다 기본값은 off | No |
target | 특정 VM 버젼으로 컴파일 할수 있도록 한다 | No |
verbose |
컴파일시 그 내용을 화면에 출력한다 기본값은 no |
No |
depend |
이를 지원하는 컴파일러는 dependecy-tracking를 가능하게 한다 |
No |
includeAntRuntime |
ant run time library를 포함하여 컴파일하며 기본값은 yes |
No |
includeJavaRuntime |
VM이 실행될때의 run time library를 포함하여 컴파일하며 기본값은 no |
No |
fork | 외부의 JDK를 사용하여 컴파일 하며 기본값은 no | No |
executable |
fork를 yes로 하였을경우 javac가 실행될 경로를 나타내며 기본값으로는 ant에서 현재 사용중인 java version의 컴파일러를 나타낸다 |
No |
memoryInitialSize |
VM내에서 초기 메모리 사이즈를 설정하며 기본값은 VM에 설정된 기본값을 사용한다 |
No |
memoryMaximumSize | VM내에서 최대 메모리 사이즈를 설정 | No |
failonerror |
컴파일시 에러가 발생하였을 경우 계속 진행할지 여부를 나타내며 기본값은 true |
No |
source | -source 옵션을 이용하여 컴파일 한다 | No |
compiler |
사용할 컴파일러 설정 list |
No |
listfiles |
컴파일 되는 소스파일들을 list할지 여부를 나타내며 기본값은 no |
No |
tempdir |
ant가 사용하는 임시디렉토리 기본값은 java.io.tmpdir (ant 1.6이후) |
No |
2. <javadoc>
① 개요
-. 자바 소스 파일로 부터 javadoc API 문서를 생성한다
② 사용예제
③ 속성
속성 | 설명 | 사용범위 | 필수여부 |
sourcepath | 자바 소스 위치 | all | At least one of the three or nested <sourcepath> , <fileset> or <packageset> |
sourcepathref | 참조된 경로 아이디를 사용하여 소스위치를 지정 (path 의 refid를 사용) | all | |
sourcefiles | 컴마로 구분하여 소스 파일을 지정 | all | |
destdir | 결과물(java docs) 디렉토리를 지정 | all | Yes, unless a doclet has been specified. |
maxmemory |
javadoc VM에 할당할 최대 메모리 사이즈 |
all | No |
packagenames |
컴마로 구분된 패키지 파일 목록 ("*"로 끝나면 하위 패키지까지 모두 javadoc으로 처리한다) |
all | No |
packageList | 처리할 패키지를 포함하고있는 파일명 | all | No |
classpath | 사용할 클래스 패스 | all | No |
Bootclasspath |
사용할 bootstrap 클래스 패스 |
all | No |
classpathref | 참조된 경로 아이디를 사용하여 클래스 패스를 지정 (path 의 refid) | all | No |
bootclasspathref | 참조된 경로 아이디를 사용하여 bootstrap classpath를 지정 | all | No |
Extdirs | 설치된 extension 위치 | all | No |
Overview |
HTML 문서로부터 overview 문서를 읽어온다 |
all | No |
access |
Access mode를 지정한다
|
all | No |
Public | 생성된 문서에 public 클래스와 멤버만 보여준다 | all | No |
Protected | 생성된 문서에 protected/public 클래스와 멤버만 보여준다 | all | No |
Package | 생성된 문서에 package/protected/public 클래스와 멤버만 보여준다 | all | No |
Private | 생성된 문서에 모든 클래스와 멤버를 보여준다 | all | No |
Old | jdk 1.1 버젼으로 문서를 생성한다 | 1.2 | No |
Verbose | javadoc을 생성하는동안 메세지를 화면에 출력한다 | all | No |
Locale |
사용할 Locale 을 지정한다 (en_US, en_US_WIN, ko_KR) |
all | No |
Encoding | 소스파일 encoding 이름 | all | No |
Version | @version 단락을 포함한다 | all | No |
Use | 클래스와 패키지 사용법에 대한 페이지를 생성한다 | all | No |
Author | @author 단락을 포함한다 | all | No |
Splitindex | Split index into one file per letter | all | No |
Windowtitle | 생성된 문서의 브라우져 타이트을 지정한다 (텍스트) | all | No |
Doctitle |
패키지 인덱스 페이지에 대한 타이틀을 지정한다 (html 코드) |
all | No |
Header |
각페이지에대한 헤더부분을 지정한다 (html 코드) |
all | No |
Footer | 각페이지에대한 푸터부분을 지정한다 (html 코드) | all | No |
bottom | 각페이지에대한 버텀부분을 지정한다 (html 코드) | all | No |
link |
주어진 URL로 javadoc 출력물에 link를 생성한다 |
all | No |
linkoffline | Link to docs at <url> using package list at <url2> - separate the URLs by using a space character -- see also the nested link element. |
all | No |
group | 특정 패키지들에 대한 overview 페이지를 생성한다 | all | No |
nodeprecated | @deprecated 정보를 포함하지 않는다 | all | No |
nodeprecatedlist | deprecated 목록을 생성하지 않는다 | all | No |
notree | 클래스 하이라키를 생성하지 않는다 | all | No |
noindex | 인덱스를 생성하지 않는다 | all | No |
nohelp | 도움말 link를 생성하지 않는다 | all | No |
nonavbar | 네비게이션 바를 생성하지 않는다 | all | No |
serialwarn | @serial tag 대한 warning을 생성한다 | all | No |
helpfile | help 파일로 사용될 HTML 파일을 지정한다 | all | No |
stylesheetfile | CSS 로 사용할 파일을 지정한다 | all | No |
charset | 문서를 생성할때 사용될 charset을 지정한다 | all | No |
docencoding | 결과 파일(문서)에 사용될 encoding을 지정한다 | all | No |
doclet |
doclet을 시작하는 클래스 파일을 지정한다 |
all | No |
docletpath |
doclet 클래스 패스를 지정한다 |
all | No |
docletpathref | 참조 아이디값을 이용해 docletpath를 지정한다 | all | No |
additionalparam |
javadoc 명령에서 추가적인 파라미터를 추가하도록 한다 |
all | No |
failonerror |
에러 발생시 build 중단할지 여부를 나타낸다 |
all | No |
excludepackagenames | 문서를 생성하지 않을 패키지를 컴마로 구분하여 지정한다ment. | all | No |
defaultexcludes |
기본적으로 제외되는 목록을 사용할 것인지 여부를 나타낸다 |
all | No |
useexternalfile |
명령줄을 간단히하기위해 임시파일에 기록된 소스파일명을 지정한다 기본값은 No |
all | No |
source |
j2se 1.4 소스코드에 나타난 주장을 처리하도록 javadoc에서 설정한다 |
1.4+ | No |
linksource |
소스파일에 hyperlinks 생성한다 기본값은 No (ant 1.6이후) |
1.4+ | No |
breakiterator |
새로운 breakiterator 알고리즘을 사용한다 기본값은 No (ant 1.6이후) |
1.4+ | No |
noqualifier |
-noqualifier 옵션을 설정한다 (ant 1.6이후) |
1.4+ | No |
includenosourcepackages |
"true"이면 자바소스가 아닌 패키지된 html을 가지고 문서 생성이 한다 (ant 1.6.3이후) |
all | No (default is false ) |
executable |
실행될 javadoc 위치를 지정한다 (ant 1.6이후) |
all | No |
3. <war>
① 개요
-. 웹 어플리케이션 배포 파일인 war 파일을 생성해 준다
② 사용예제
③ 속성
속성 | 설명 | 필수여부 |
destfile | 생성될 WAR 파일 지정 | 둘중 하나는 필수 |
warfile | Deprecated | |
webxml | 사용할 deployment descriptor (WEB-INF/web.xml)를 지정 | Yes |
basedir | jar파일로 압축할 디렉토리를 지정한다 | No |
compress |
data를 압축할지 여부를 나타내며 기본값은 true이다 keepcompression 속성을 false로 했을지라도 이는 적용된다 |
No |
keepcompression |
이미 존재하는 파일 묶음에 대해 compress을 계속 유지할 것인지 여부를 나타내며 기본값은 fale 이다 (ant 1.6이후) |
No |
encoding |
압축될 파일명에 사용할 encoding을 지정한다 기본값은 UTF8 |
No |
filesonly |
Store only file entries 기본값은 false |
No |
includes | 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에 포함하며 생략하면 모든 파일을 WAR한다 | No |
includesfile | 지정된 개개의 파일을 WAR에 포함한다 | No |
excludes | 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에서 제외시키며 생략하면 어떠한 파일로 제외하지 않는다 | No |
excludesfile | 지정된 개개의 파일을 WAR에서 제외시킨다 | No |
defaultexcludes | 기본적으로 제외시키는 기능을 사용할것인지 여부를 나타낸다 | No |
manifest | 사용할 manifest 파일을 지정한다 | No |
update | 이미 존재하는 파일이라면 업데이트할지 덮어쓸지를 결정하며 기본값은 false이다 | No |
duplicate |
중복된 파일이 나타났을 때 "add"할지 "preserve"할지 혹은 "fail"할지를 지정하며 기본값은 "add"이다 |
No |
roundup |
파일 시간 비교시 파일 변경 시간을 다음 짝수 횟수의 초(seconds)에 반올림 할지 혹은 내림할지 여부를 나타낸다 기본값은 true |
No |
from http://ant.apache.org/manual/index.html
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta Ant
I. Ant 야 놀자~
Ant 란 "Java 기반의 빌드 도구입니다" 라고들 많이 나와있습니다
근데 이게 대체 무순 뜻이란 말인가 ㅡ.ㅡ;
쉽게 예기해서 환경에 구애받지 않고 간단히 java 소스를 컴파일 하고 필요한 파일이 있다면
그 파일들을 복사나 삭제하며 또한 javadoc 이나 war 같은 배포용 파일까지 생성해 주며
필요하다면 서버에 까지 바로 적용할 수 있도록 도와주는 도구입니다.
또한 여러팀원들이 프로젝트를 진행할 때 새로운 팀원이 참가하더라도
Ant 설정파일을 공유함으로써 손쉽게 참여가 가능하다는 것입니다
아직 사용해 보지 않았다면 얼렁 익혀서 사용해봅시다 무~지 편하답니다
II. 설치해보자
다운로드
Ant
http://ant.apache.org/bindownload.cgi
Ant manual
http://ant.apache.org/manual/index.html
http://ant.apache-korea.org/manual/index.html
다운받은 파일의 압축을 풀고 환경변수 및 패스를 잡아줍니다
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.4.2
set PATH=%PATH%;%ANT_HOME%\bin
III. 간단한 Ant 예제
Ant를 이용하여 web application을 구성할 때 다음의 구조를 유지하기를 권장합니다
① build : src, web, docs에서 결과적으로 만들어진 산출물 디렉토리
② dist : build를 배포하기 위한 배포 디렉토리
③ docs : 배포판에 배포할 정적인 문서를 관리할 디렉토리
④ src : /WEB-INF/classes 에 위치할 java 소스 디렉토리
⑤ web : HTML, JSP, 이미지등의 컨텐트 디렉토리 (WEB-INF의 서브디렉토리 포함)
⑥ build.properties : build.xml에서 사용할 properties
⑦ build.xml : ant 명령으로 실행될 설정파일
src에 하나이상의 java 소스를 테스트로 넣어 놓으세요
자 이렇게 디렉토리를 설정하고 build.xml 을 다음 step에 따라 따라 해 BOA요 ^^&
STEP 1. build.xml 의 기본구조
xml을 기본적인 내용을 안다면 이해하기 쉽습니다
하나의 build 파일은 하나의 project로 구성되며 이는 다시 여러 target으로 구성됩니다
target 이란 빌드 과정중 수행해야 할 task들을 모아놓은 job 단위 라고 보면 됩니다
compile target이라 한다면 compile에 관련된 작업들을 모아놓은 그룹이라 생각하면 쉽게 이해 될겁니다
STEP 2. 시~작 Ant 맛보기~
① build.xml에 다음을 입력한 후 저장 합니다
-. project
project는 하나 이상의 target을 정의 합니다 또한 하나의 target은 task의 집합입니다
ant를 실행할 시에 어느 타겟을 실행할 것인지 지정할 수가 있으며 (예: \ant clear)
지정하지 않았을 경우 디폴트로 설정된 값이 사용됩니다 이부분이 default="clear"입니다
-. property
전역변수 설정 혹은 그렇게 사용할 build.properties를 정의 합니다
build.properties에 catalina.home을 정의하였으며 여러 환경이 변하더라도 이 값만
변경해주면 build.xml을 수정없이 바로 실행 가능합니다
-. echo
message 내용을 출력 합니다
-. target
target 이란 task의 집합으로 실질적으로 실행될 코드들의 묶음입니다
여기서는 아무 task도 없습니다
② build.properties에 다음을 입력 후 저장합니다
catalina.home 은 변수로 사용할 것이며 그 값은 C:\Tomcat 5.0입니다
③ 실행
해당 디렉토리로 이동하여 도스창에서 ant 라고 칩니다
STEP 3. 사전작업 하기~
이번 단계에서는 컴파일 하기전 전역변수 선언이나 컴파일 시 클래스 패스 설정을 해봅시다
① build.xml
-. project
이번에는 default 값을 prepare로 하였습니다 고로 target은 prepare가 실행될 것입니다
-. property
역시나 build.properties를 정의하였고 여러 전역변수를 설정하였습니다
build.home 이란 변수에는 ${basedir}/build 값이 정의되었으며
build.home은 ${build.home}으로 사용할수 있습니다
궁금하면 <echo message="${build.home}"/> 등으로 출력해 봅시다~
-. path
${catalina.home} 은 build.properties에서 정의하였다는것을 기역하실겁니다
fileset은 파일들의 집합을 나타내는데 어떤 특정파일만 포함 할수 있거나 혹은 어느 특정파일만 제외할 수 있습니다
특정파일만 포함하는것은 include 태그이며 그 반대는 exclude 입니다
<fileset dir="${web.home}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
이부분은 ${web.home}/WEB-INF/lib 에서 *.jar 파일만 클래스패스로 잡겠다는 의미입니다
-. target
드디어 실질적으로 실행될 target 입니다.
project 속성의 default가 prepare이므로 prepare target으로 실행하기 위해 가보니 depend 속성으로 "clean"이 설정되어 있습니다
이것은 "clean" target을 먼저 실행 후 prepare를 실행하라는 말입니다
즉 prepare는 clean이 실행조건 입니다
clean target은 delete 태그를 이용하여 배포할 dist 디렉토리와 산출물 디렉토리인 build를 삭제하는 작업입니다
prepare target으로 다시 와보면 mkdir 는 당연히 디렉토리를 만들라는 뜻입니다
copy는 todir에 다음 web.home의 모든 fileset을 copy 하라는 의미입니다 여기서도 역시나 include, exclude가 사용될 수 있겠지요
<include name="**/*.jsp"/> 는 모든디렉토리의 *.jsp 를 카피하라는 의미입니다
즉 web 디렉토리의 모든 실행 가능할 파일을 build로 옮기는 작업입니다
② 실행
STEP 4. 컴파일 하기
이제 컴파일할 모든 준비가 되었습니다
STEP2의 소스에 다음 target을 추가하고 project의 default 값을 compile로 수정한 후 실행해 봅시다
② 실행
STEP 5. Javadoc 을 이용해 API를 만들어 보고 배포파일도 생성해 보자
이제 컴파일도 했으니 javadoc도 만들어 보고 war 같은 배포파일도 생성해 봅시다
STEP 3.까지의 build.xml에 아래 target을 더 추가하고 project의 default 값에 dist로 설정합니다
① build.xml
-. target
target의 실행순서는 clean, prpare, compile, javadoc, dist가 될겁니다
javadoc target의 javadoc 태스트를 보면 java 소스가 있는 소스디렉토리와
API를 생성할 타겟 디렉토리를 정해주면 알아서 API를 생성해 줍니다
만들어진 API는 배포버젼의 dist디렉토리로 해주면 더 좋겠지요
dist target은 배포파일인 war를 만듭니다
필요한 문서가 있으면 docs 디렉토리를 만들어 로 복사도 하도록 합시다
jar 태스크는 위의 방식과 같이 사용합니다
② 실행
VI. Ant 실행
① C:\예제\ant -help
ant [options] [target [target2 [target3] ...]]
Options :
-help 이 메세지의 표시
-projecthelp 프로젝트 도움 정보의 출력
-version 버전 정보의 출력과 종료
-diagnostics diagnose 나 report 문제에 도움이 되는 정보의 출력.
-quiet, -q 한층 더 메세지를 적게
-verbose, -v 한층 더 메세지를 많게
-debug 디버그 정보의 출력
-emacs adornments 없이 로그 정보의 생성(produce)
-logfile <file> 로그를 지정 파일에 출력
-l <file> ''
-logger <classname> 로그 생성을 실행하기 위한 클래스
-listener <classname> 프로젝트 청취자(listener) 역할의 class의 인스턴스를 추가
-buildfile <file> 지정된 빌드 파일의 사용
-file <file> ''
-f <file> ''
-D<property>=<value> 지정된 프로퍼티의 값의 사용
-propertyfile <name> 모든 프로퍼티를 파일로부터 로드 (-D프로퍼티보다 전에)
-inputhandler <class> 입력 요청(requests)를 취급하는 클래스
-find <file> 파일시스템의 루트로 향해 빌드파일을 검색하고 그것을 사용
② C:\예제\ant
현재 디렉토리에 있는 build.xml
파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
③ C:\예제\ant compile
현재 디렉토리에 있는 build.xml이 실행되며 파라미터로 compile을 지정하면 project의 default 값을 무시하고 compile target을 실행합니다 물론 depends 가 있다면 먼저 실행합니다
④ C:\예제\ant -buildfile test.xml
현재 디렉토리에 있는 test.xml
파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
⑤ C:\예제\ant -buildfile test.xml dist
현재 디렉토리에 있는 test.xml
파일을 이용해, dist
라는 이름의 타겟으로 Ant 를 실행합니다.
⑥ C:\예제\ant -buildfile test.xml -Dbuild=build/classes dist
현재 디렉토리에 있는 test.xml
파일을 이용해, dist
라는 이름의 타겟으로, build
프로퍼티에 build/classes
값을 설정해 Ant 를 실행합니다.
VII. 기본 프로퍼티
Ant는 다음과 같은 프로퍼티를 기본으로 제공합니다
① basedir : 기본 디렉토리 경로를 나타내며 project 태그의 basedir에 명시되어 있습니다
② ant.file : 빌드 파일의 절대 경로입니다
③ ant.version : Ant 버젼을 나타냅니다
④ ant.project.name : project 태그의 name에 명시되어있습니다
⑤ ant.java.version : 자바 버젼을 나타냅니다
⑥ 자바 시스템 프로퍼티를 사용 가능 합니다
예) ${os.name} 참고 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()
<echo message="${ant.file}"/> 으로 한번 출력해 보면 이해가 쉽습니다
다음 시간에는 각 타스크의 종류와 상세 설정에 관해 알아봅시다
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
어떻게 소프트웨어 개발자의 생산성을 향상시킬 수 있는가?
지금까지 다년간의 일상을 통해 얻는 대답은 컴퓨터를 사용하는 대부분의 사람들에게 적용되는데, 보다 큰 화면을 쓰라는 것이다.
15년전 모든 개발자가 21인치 화면으로 작업해야 한다고 권고해서 사람들을 놀라게 하곤 했다. 당시, 모두가 최소한 20인치 화면 두 개는 갖고 있어야 한다고 주장했다.
그 것이 왜 중요한가? 작은 화면을 사용하면 한번에 많은 것을 볼 수 없다. 따라서, 다른 것을 보기 위해서는 지금의 창 앞에 새창을 띄워야 한다. 두 개의 화면을 이용하면 한번에 필요한 모든 꾸러미를 모두 화면에 놓을 수 있다. 단지 머리를 움직이기만 하면 된다. 내 눈은 지금 Emacs에서 편집중인 문자 사이를 가볍게 움직일 수 있다. 나는 수많은 하위 창이 열린 IDE를 열어둔 채로 오른편에는 브라우저에서 문서를 열어놓을 수 있다. 터미널 윈도우를 열기 위해서 작업 표시줄을 둘러볼 필요가 없이, 마우스를 이미 열려있는 창으로 가져가서 타이핑을 한다. 시도해보지 않은 사람은 얼마나 개선되는지 짐작할 수 없다. 나는 두 개의 화면을 쓰기 시작한 후에 달라진 것을 확연하게 느낄 수 있다.
그리고 두 개의 화면을 사용하는 것은 대부분의 사람들이 생각하는 것처럼 비싸지 않다. 친구와의 채팅으로 가격을 알아보니 내 두대의 삼성(Samsung) 204B 모델은 $700이었다. 개발자의 몸값은 비싸고, 그에 비하면 모니터 가격은 그리 큰 비용이 아니다 (흠.. 내 책상에는 세번째 화면을 맞이할 공간이 있군.)
최근에는 흔하게 작은 화면에서 페어 프로그래밍을 하는 모습을 볼 수 있다. 이것은 어리석은 짓이다. 큰 화면을 사용하는 것은 현명한 투자다.
원문: BigScreen
마이플렛폼 교육자료로 받은 것중에....
동적으로 객체 생성 및 삭제 하기...
============================================================================================
// Create()
function btn_create_OnClick(obj)
{
Create( // Component를 동적으로 생성
"Static", // Component이름
"Static0", // Component ID
"Text='sample' Left='100' Top='100' Width='100' Height='100'"); // Property설정
}
// Object()
function btn_object_OnClick(obj)
{
alert(Object("Static0").Text); // Static0에 해당하는 Component ID찾기
}
// Destroy()
function btn_destroy_OnClick(obj)
{
Destroy("Static0"); // Static0에 해당하는 Component제거
}
============================================================================================
스크립트 부분입니다...
System.out.print() 가 있다..
음... 이것이 무엇인데;; () 안에 값을 넣으면 콘솔창에 값이 찍히는걸까;;
작년 java 교육을 받을 때 강사가 했던 말이 문득 생각이 나는데..
강사 왈 : System.out.print()를 이해하면 객체지향에 대해선 다 이해한거나 다름 없다~ ;;
라는 말을 했다...
뭐 물론..... 그땐 정말 그런줄 알았다.. ㅋ
그렇다고 아니라는 이야기는 아니고..ㅋ
System.out.print() .. 이놈... 음... 뭐가 닷트(.) 을 한개도 아니고 두개씩 찍었다..
처음 이걸 보면 뭐야 이거... 그냥 이렇게 쓰면;; 찍히니까;; 아무 생각없이 썼을 것이다..
나도 ... 그냥 책에 나와 있으니;; 그냥 썼고... 의식하지 않으면 그냥 넘어갈 수 있는 것이고..
구지 왜 저렇게 되는거라는걸 이해 하지 않아도 된다.. 왜냐면 그냥 쓰면 콘솔창에 찍히고..
다들 아무런 의심없이 그냥 쓰니까.... 그냥... 그냥... 쓰니까..
그래도 알고가면... 괜찮을것 같아서... 잘 알지는 못하지만... 아는데로 적어본다... ㅋㅋ
System 객체는 아마도 ~ 자바 머신이 돌아가고 있는
시스템을 객체화 시켜놓은 클래스 같다라는 생각이 든다..(이건 단순 제생각이에요^^;;ㅋ 믿거나 말거나..ㅋ)
API 에서 System 클래스를 찾아보면..
----------------------------------------------------------------------------------------------------------------
System 클래스에 의해 얻을 수 있는 기능에는 표준 입력, 표준 출력 및 에러 출력 스트림, 외부적으로 정의된 프로퍼티 및 환경
변수에의 액세스, 파일 및 라이브러리의 로딩 방법, 배열의 일부를 재빠르게 카피하는 유틸리티 메서드가 있습니다.
----------------------------------------------------------------------------------------------------------------
이런문구가 있다... 우리가 오늘 보고자 하는건 많은 기능들중.. 표준출력에 대해서 알아보는거니까..
out 필드에 초점을 맞추려고 한다.. 표준 출력.. 이러면 꼭 메소드 같은데.. out은..
System클래스의 메소드가 아니라 필드(변수)이다...
System.java를 까보면
public final static PrintStream out = nullPrintStream(); 요렇게 System의 상수라는걸 알수 있다..
그러고 out의 타입은 PrintStream ......
(클래스이름.변수이름 이 가능한건 static으로 선언되어 있기때문에.. 클래스 생성할 필요 없이 접근이 가능한건 알고 계시겟죠?)
PrintStream객체는 자바 io에 양대 산맥 InputStream과 OutputStream중 OutputStream의 손자벌 되는 객체이다..
PrintStream의 아부지는 FliterOutputStream이고 FliterOutPutStream의 아무지는 OutputStream 이니까;; 손자 인듯 싶다..
이걸 보아선 PrintStream은.. 출력하는것이다.. (자세한 기능들은 API에서 PrintStream을 쳐보세요..ㅋㅋ)
잠깐 다른길로 빠졌는데..
무튼 out은 PrintStream 타입이므로 (out은 단지 이름일 뿐이고 실질직인 PrintStream을 담는 통이다.. )
out.메서드 이런식으로 하면.. printStream의 메소드가 호출 되는것이다..
String a = "JAVA";
a.toString(); 요것이 가능하듯이.. out.print() 가 가능한것이다..
다시 말해서 PrintStream이라는 객체를 만들어서 out이라는 곳에 담아 놓것 뿐이다..
out.print() 이건 실질적인 PrintStream의 print()의 메소드를 부르는것 뿐이다..
그러고 out에 담겨 잇는 PrintStream의 출력 대상은 FileOutputStream 인데 이 FileOutputStream의 대상파일은
FileDescriptor 이라는 건데 이건..
/*
[운영 체계에서 파일을 사용할 때 각 파일에 대한 정보를 유지하는 기억 장치의 한 영역 또는 그 정보 ]
(네이버 사전참조) 이런 의미가 있다네요.. 요건 OS의 파일기술자와 관련 있는 부분이에요~
*/
이런거랍니다..
주절주절 적은듯 한다..
이제 결론을 내자면...
System.out ==> 요렇게 하면 Sun에서 구현해놓은데로 System객체가 초기화 되면서..
FileDescriptor을 이용 하여 OS의 표준출력으로 출력 타켓을 잡은 PrintStream이 생성이 됩니다.
그러고 나서 print()메소드를 호출하면..
PrintStream이 생성되면서 타켓으로 잡힌 파일(표준출력도 특정한 파일이라고 이해하시면 되요..)에다가
Write를 하게 되는 거죠..
그래서 System.out.print("JAVA"); 이렇게 하면
콘솔창에 JAVA라는 글씨가 찍히게 되는거랍니다..
----------------------------------------------------------------------------------------------------------------
System 초기화 되면서 FileDescriptor를 통해 PrintStream의 타켓을 운영체제 File Descriptor 잡아줌.
그러고 PrintStream에 있는 print 메소드들을 통해서 OS 표준출력에다가 출력 문구들을 쏘아줌..
콘솔창에 원하는 문구 출력..ㅋㅋ
----------------------------------------------------------------------------------------------------------------
** PrintStream의 타켓 잡히는 부분..
... 생략..
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
... 생략..
요런식으로 잡힌답니다..
첨에는 쉽게 생각하고 글을 적기 시작했는데;; 결국 FileDescriptor에 막혀서 한시간이 넘게 걸려 버렸네요..
우리 싸부의 도움으로 글을 마무리 지을수 있었어요..ㅋ (언제나 컨설트 비용은 안주냐면서 ... 구박을 하지만..ㅋㅋ)
별첨~! 도움말.. ㅋㅋ
싸부 이름 --> 허 진 영 ㅋ
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
사실 모든 입출력(소켓통신을 포함해서)은
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
파일에 쓰는 것과 비슷하지
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
어찌보면 특정 파일에 쓴다라고 보는게 맞을 듯
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
그 파일에 쓰면 해당하는데로 전송되는건데..
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
System.out 은
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
표준 출력이라는 특별한 파일에 쓰기를 하는거야
OS 에서.. 파일에 입출력을 하려고 파이을 열때, 혹은 소켓통신을 위해 소켓을 열때..
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
파일 디스크립터라는 것을 생성하지.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
뭐 그냥 번호 같은 거야.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
몇번째.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
돈 내.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
건당 만원이잖아
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
여태까지 얼마야.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
ㅋㅋㅋ
JDK 1.5 has some very useful enhancements. Thanks to Josh Bloch of Sun Microsystems for helpful hints.
Early Access: there is an interactive version of this page here where you can post your code fragments to the community at large.
--------------------------------------------------------------------------------------
1.Autoboxing
Java's
distinction between primitive types and their equivalent Object types
was painful. Fortunately, with the advent of autoboxing, that will
become a fading memory.
// automatically convert one type to another
Integer integer = 1;
System.out.println(integer);
// mix Integer and ints in the same expression
int i = integer + 3;
System.out.println(i);
Sample output:
1
4
--------------------------------------------------------------------------------------
2.Collections
The collections framework is greatly enhanced by generics, which allows collections to be typesafe.
LinkedList<String> stringList = new LinkedList<String>();
stringList.add("of");
stringList.add("course");
stringList.add("my");
stringList.add("horse");
Iterator<String> iterator = stringList.iterator();
for (String s : stringList)
System.out.print(s + " ");
Sample output:
of course my horse
--------------------------------------------------------------------------------------
3. Enhanced for loop
int array[] = {1, 2, 3, 4};
int sum = 0;
for (int e : array) // e is short for element; i would be confusing
sum += e;
System.out.println(sum);
Sample output:
10
--------------------------------------------------------------------------------------
4.Enums
Java programmers rejoice with the availability of enums.
enum Suit { clubs, diamonds, hearts, spades };
for (Suit suit : Suit.values())
System.out.println(suit);
Sample output:
clubs
diamonds
hearts
spades
Here is a more complex example.
enum Coin {
penny(1), nickel(5), dime(10), quarter(25);
Coin(int value) { this.value = value; }
private final int value;
public int value() { return value; }
};
for (Iterator<Coin> i = Arrays.asList(Coin.values()).iterator();
i.hasNext(); ) {
Coin coin = i.next();
System.out.print(coin + " ");
}
Sample output:
penny nickel dime quarter
--------------------------------------------------------------------------------------
5. Formatted Output
Developers
now have the option of using printf type functionality to generated
formatted output. Most of the common C printf formatters are available.
System.out.printf("name count\n");
String user = "fflintstone";
int total = 123;
System.out.printf("%s is %d years old\n", user, total);
--------------------------------------------------------------------------------------
6. Importing Static Members
No longer is it necessary to write
Math.abs(x) Math.sqrt(x) Math.max(a, b)
We can now import once and write it like this:
import static java.lang.Math.*;
public class Import {
public static void main(String[] args) {
double x = 16.0, a = 2.2, b = 3.3;
System.out.println(abs(x));
System.out.println(sqrt(x));
System.out.println(max(a, b));
}
}
Sample output:
16.0
4.0
3.3
--------------------------------------------------------------------------------------
7. Improved Diagnostic Ability
This is one of Calvin Austin's code examples.
Generating Stack traces has been awkward if no console window has been available. Two new APIs, getStackTrace and Thread.getAllStackTraces provide this information programmatically.
StackTraceElement e[]=Thread.currentThread().getStackTrace();
for (int i=0; i <e.length; i++) {
System.out.println(e[i]);
}
System.out.println("\n"+Thread.getAllStackTraces());
Sample output:
java.lang.Thread.dumpThreads(Native Method)java.lang.Thread.getStackTrace(Thread.java:1333)Class2005.main(Class2005.java:5)
{Thread[Reference Handler,10,system]=[Ljava.lang.StackTraceElement;@130c19b,
Thread[main,5,main]=[Ljava.lang.StackTraceElement;@1f6a7b9,
Thread[Signal Dispatcher,10,system]=[Ljava.lang.StackTraceElement;@7d772e,
Thread[Finalizer,8,system]=[Ljava.lang.StackTraceElement;@11b86e7}
--------------------------------------------------------------------------------------
8. Metadata
This is one of Calvin Austin's code examples.
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug {
boolean devbuild() default false;
int counter();
}
public class MetaTest {
final boolean production=true;
@debug(devbuild=production,counter=1) public void testMethod() { }
public static void main(String[] args) {
MetaTest mt = new MetaTest();
try {
Annotation[] a = mt.getClass().getMethod("testMethod").getAnnotations();
for (int i=0; i<a.length ; i++) {
System.out.println("a["+i+"]="+a[i]+" ");
}
} catch(NoSuchMethodException e) {
System.out.println(e);
}
}
}
--------------------------------------------------------------------------------------
9. Monitoring and Manageability
This is one of Calvin Austin's code examples.
Monitoring and Manageability is a key component of RAS (Reliability, Availability, Serviceability) in the Java platform. The following code reports the detailed usage of the memory heaps in the Hotspot JVM. This feature isn't quite working yet, as you can see.
import java.lang.management.*;
import java.util.*;
import javax.management.*;
public class MemTest {
public static void main(String args[]) {
List pools =ManagementFactory.getMemoryPoolMBeans();
for(ListIterator i = pools.listIterator(); i.hasNext();) {
MemoryPoolMBean p = (MemoryPoolMBean) i.next();
System.out.println("Memory type="+p.getType()+" Memory usage="+p.getUsage());
}
}
}
Sample output:
Memory type=Non-heap memory Memory usage=initSize = 163840, used = 494144, committed = 524288, maxSize = 33554432Memory type=Heap memory Memory usage=initSize = 524288, used = 166440, committed = 524288, maxSize = -1Memory type=Heap memory Memory usage=initSize = 65536, used = 0, committed = 65536, maxSize = -1Memory type=Heap memory Memory usage=initSize = 65536, used = 0, committed = 65536, maxSize = 0Memory type=Heap memory Memory usage=initSize = 1441792, used = 0, committed = 1441792, maxSize = 61997056Memory type=Non-heap memory Memory usage=initSize = 8388608, used = 84360, committed = 8388608, maxSize = 67108864Memory type=Non-heap memory Memory usage=initSize = 8388608, used = 5844808, committed = 8388608, maxSize = 8388608Memory type=Non-heap memory Memory usage=initSize = 12582912, used = 6010560, committed = 12582912, maxSize = 12582912## An unexpected error has been detected by HotSpot Virtual Machine:## SIGSEGV (0xb) at pc=0x42073770, pid=24776, tid=1073993792## Java VM: Java HotSpot(TM) Client VM (1.5.0-beta-b31 mixed mode)# Problematic frame:# C [libc.so.6+0x73770] __libc_free+0x70## An error report file with more information is saved as /tmp/hs_err_pid24776.log## If you would like to submit a bug report, please visit:# http://java.sun.com/webapps/bugreport/crash.jsp#
--------------------------------------------------------------------------------------
10. Variable Arguments
This is just using ellipses as syntactic sugar for arrays.
public class Test {
// main() looks different, doesn't it?
// try changing the runtime arguments above and rerun
public static void main(String... args) {
System.out.println(args.length + " arguments");
}
}
Sample output:
3 arguments
Challenge: Here is a program that reads the name of a
class from the command line, followed by a method name. It
instantiates an object of the specified type, and invokes the method.
For example, if fed a command line like java.util.Date toString, this
program will print the current date and time. Of course, this class
only works with methods that don't require arguments. The challenge is
to use ellipses to specify the variable arguments to invoke.
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class klass = Class.forName(args[0]);
Object instance = klass.newInstance();
Method method = klass.getDeclaredMethod(args[1], new Class[] {} );
Object object = method.invoke(instance, new Object[] {} );
System.out.println(object);
} catch (java.lang.InstantiationException ie) {
ie.printStackTrace();
} catch (java.lang.IllegalAccessException iae) {
iae.printStackTrace();
} catch (java.lang.reflect.InvocationTargetException ite) {
ite.printStackTrace();
} catch (NoSuchMethodException nsme) {
nsme.printStackTrace();
} catch (Exception e) { // in case method.invoke() throws
e.printStackTrace();
}
}
}
--------------------------------------------------------------------------------------
11. Word Frequency Counter
This is Josh Bloch's new and improved word frequency counter.
import java.text.*;
import java.util.*;
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new TreeMap<String, Integer>();
for (String word : args) {
Integer freq = m.get(word);
m.put(word, (freq == null ? 1 : freq + 1));
}
System.out.println(m);
}
}
--------------------------------------------------------------------------------------
12. Grep
This is one of Sun's NIO examples. This program has a
bug: instead of working from a directory name or accepting wildcards,
the only way it works is to specify the exact filename that you are
looking for... which defeats the purpose. Perhaps you'd like to figure
out the fix?
We have placed files in the JDK 1.5 shared sandbox called /usr/share/fileXX.data, where XX runs from 1 to 10. These files have privileges that allow them to be read by users, so this example will be able to generate viewable results. If you attempt read a file for which you do not have privilege, a java.io.FileNotFoundException error will result.
/* Search a list of files for lines that match a given regular-expression
* pattern. Demonstrates NIO mapped byte buffers, charsets, and regular
* expressions. */
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.regex.*;
public class Grep {
// Charset and decoder for ISO-8859-15
private static Charset charset = Charset.forName("ISO-8859-15");
private static CharsetDecoder decoder = charset.newDecoder();
// Pattern used to parse lines
private static Pattern linePattern
= Pattern.compile(".*\r?\n");
// The input pattern that we're looking for
private static Pattern pattern;
// Compile the pattern from the command line
//
private static void compile(String pat) {
try {
pattern = Pattern.compile(pat);
} catch (PatternSyntaxException x) {
System.err.println(x.getMessage());
System.exit(1);
}
}
// Use the linePattern to break the given CharBuffer into lines, applying
// the input pattern to each line to see if we have a match
//
private static void grep(File f, CharBuffer cb) {
Matcher lm = linePattern.matcher(cb); // Line matcher
Matcher pm = null; // Pattern matcher
int lines = 0;
while (lm.find()) {
lines++;
CharSequence cs = lm.group(); // The current line
if (pm == null)
pm = pattern.matcher(cs);
else
pm.reset(cs);
if (pm.find())
System.out.print(f + ":" + lines + ":" + cs);
if (lm.end() == cb.limit())
break;
}
}
// Search for occurrences of the input pattern in the given file
//
private static void grep(File f) throws IOException {
// Open the file and then get a channel from the stream
FileInputStream fis = new FileInputStream(f);
FileChannel fc = fis.getChannel();
// Get the file's size and then map it into memory
int sz = (int)fc.size();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
// Decode the file into a char buffer
CharBuffer cb = decoder.decode(bb);
// Perform the search
grep(f, cb);
// Close the channel and the stream
fc.close();
}
public static void main(String[] args) {
if (args.length < 2) {
System.err.println("Usage: java Grep pattern file...");
return;
}
compile(args[0]);
for (int i = 1; i < args.length; i++) {
File f = new File(args[i]);
try {
grep(f);
} catch (IOException x) {
System.err.println(f + ": " + x);
}
}
}
}
Sample output
This is file #1
댓글을 달아 주세요