10/04일에 maven 3.0이 나왔습니다. http://maven.apache.org/
가볍게 2.8M의 파일을 받아서 압축을 풀었습니다. /home/kenu/java/apache-maven-3.0/

환경변수 $PATH에 maven실행파일 경로를 추가했습니다.
JAVA_HOME=/home/kenu/java/jdk1.6.0_18
PATH=$PATH:$JAVA_HOME/bin:/home/kenu/java/apache-maven-3.0/bin
export JAVA_HOME
export PATH

환경변수를 적용하고, mvn 버전을 확인합니다.
$. ~/.profile
$mvn -version
Apache Maven 3.0 (r1004208; 2010-10-04 20:50:56+0900)
Java version: 1.6.0_18
Java home: /home/kenu/java/jdk1.6.0_18/jre
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-25-generic" arch: "amd64" Family: "unix"

설치는 잘 되었습니다.
샘플 프로젝트를 만들어봅니다. phase는 generate , groupId는 com.mycompany.app, artifactId는 my-app 정도가 됩니다.
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

이렇게 만들어집니다.
kenu@kenu-ubuntu:~/maven$ cd my-app
kenu@kenu-ubuntu:~/maven/my-app$ tree
.
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java


이제 컴파일하고 빌드를 해봅니다.
mvn package

경로를 바꾸고 실행은 다음과 같이 할 수 있습니다.
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Hello World!

설치는 잘 되었습니다.
사용자 홈 디렉토리 아래 .m2 라는 폴더가 생겨서 여기에 다운로드되는 파일들이 많이 있습니다. 로컬 캐시역할을 하기 때문에 처음 실행시에는 시간이 많이 걸립니다.

Ant를 넘어서 maven으로 갈아탈 준비중입니다.

JUnit을 이용한 테스트케이스를 실행한 결과를 api형태의 보고서로 또는 그래픽으로 비주얼하게 보여줄 수 있습니다.

http://www.okjsp.pe.kr/docs/report 에서 확인할 수 있습니다.

아울러 hudson에서도 다른 형태의 리포트가 나옵니다.
우측 상단의 파란색 그래프입니다.

더 자세한 정보도 볼 수 있습니다.

http://www.okjsp.pe.kr:8080/job/okjsp%20site%20build/

아주 오래 미뤄왔던 일을 해내었습니다. 이제 버그 잡아야겠습니다.
이전 포스트에 이어집니다.

junit task를 다음과 같이 변경할 수 있습니다.
    <target name="test" depends="compile">
        <mkdir dir="report/html"/>
        <junit printsummary="on" haltonfailure="on">
            <classpath refid="test.classpath">
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="report">
                <fileset dir="dst">
                    <include name="**/*Test*"/>
                </fileset>
            </batchtest>
        </junit>
    </target>

리포팅 기능을 강화한 설정입니다.
report 폴더에 TEST-*.xml 파일이 생성이 됩니다.
이 파일을 이용해서 다음과 같은 문서를 생성할 수 있습니다.


추가되는  junitreport 코드는 다음과 같습니다. 굵게 표시해 놓았습니다.
    <target name="test" depends="compile">
        <mkdir dir="report/html"/>
        <junit printsummary="on" haltonfailure="on">
            <classpath refid="test.classpath">
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="report">
                <fileset dir="dst">
                    <include name="**/*Test*"/>
                </fileset>
            </batchtest>
        </junit>
        <junitreport todir="report">
            <fileset dir="report">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="report/html"/>
        </junitreport>
    </target>

이제 남은 작업은 소스와 테스트코드 분리 설정과 그 후에 okjsp사이트에 적용하는 것입니다.
샘플 첨부합니다.

참고서적: 이클립스 프로젝트 필수 유틸리티, 민진우, 이인선 , 한빛미디어, 2009, p251~255
생각보다 쉽게 풀리지 않습니다. 테스트 코드와 애플리케이션 코드의 분리는 아직 적용하기 전입니다. classpath를 두 가지로 놓아 둔 것이 특징이라면 특징이겠죠. 멋지게 나오는 리포트까지 몇 번 더 진화를 시켜야하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
     2009. 6. 9. 오전 8:23:18
     junit   
     test case report
     kenu
====================================================================== -->
<project name="junit" default="compile">
    <description>
            test case report
    </description>
    <path id="classpath1">
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id="test.classpath">
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
        <path location="dst"></path>
    </path>

    <!-- =================================
          target: default             
         ================================= -->
    <target name="compile" description="test case report">
        <mkdir dir="dst"/>
        <javac srcdir="src" destdir="dst" debug="on">
            <classpath refid="classpath1">
            </classpath>
        </javac>
    </target>

    <!-- - - - - - - - - - - - - - - - - -
          target: depends                     
         - - - - - - - - - - - - - - - - - -->
    <target name="test" depends="compile">
        <junit>
            <classpath refid="test.classpath">
            </classpath>
            <test name="test.UnitTest"></test>
        </junit>
    </target>

</project>


이클립스 프로젝트 파일 첨부합니다.

이클립스 프로젝트 필수 유틸리티 : subversion, Ant, JUnit, Trac이클립스 프로젝트 필수 유틸리티 : subversion, Ant, JUnit, Trac - 10점
민진우 외 지음/한빛미디어
이클립스를 기준으로 CVS,Subversion,Ant,JUnit,Trac에 관한 부부개발자의 경험담입니다. 초판에는 CVS,Ant,JUnit,Scarab을 다루었던 것으로 기억합니다. 책의 실습예제로 초간단 블로그 만들기 프로젝트를 다룹니다. 언어보다 더 빨리 변하는 것이 도구이기도 합니다. 이런 도구의 사용법을 문서로 전달한다는 것이 쉽지 않지만 개정판이 나와서 다행입니다.

최근 OKJSP에 트랙을 사용하기 시작했는데, 리눅스에 트랙설치는 쉽지 않은 일이었습니다. 윈도우환경으로는 저자 민진우님이 TOW라는 오픈소스 프로젝트를 진행하고 계십니다. http://sourceforge.net/projects/raconwindows

이런 도구를 다른 개발자에게 쓰도록 공감대를 형성하는 것은 툴 자체보다 어려운 듯 합니다.

앞서 오픈소스인 httpunit을 통해서 프로젝트 소스 구성을 살펴봤습니다. 빌드스크립트인 build.xml를 통해서 프로젝트 소스를 가공하는 방법을 알 수 있습니다. 프로젝트의 작업 지시서와 같은 역할을 하는 것이죠.

이클립스의 아웃라인뷰에 나오는 타겟 목록입니다.
소스를 보면 <project ... default="jar"> 내용을 확인 할 수 있습니다. 기본 프로젝트 타겟은 jar 입니다.

그 외에도 수많은 작업그룹이 보입니다. 각각의 내용을 확인해 봐야 정확한 작업 내용을 알 수 있겠지만 여기서는 jar 를 중심으로 살펴보겠습니다.

<!--  ===================================================================  -->
<!--  Creates the jar archive                                              -->
<!--  ===================================================================  -->
<target name="jar" depends="compile" description="create the jar file">
    <mkdir dir="${lib.dir}" />
    <echo file="${build.dir}/info.txt">Manifest-Version: 1.0
Sealed: false
HttpUnit-Version: ${version}
Build-Date: ${TODAY}
Build-Time: ${TSTAMP}
</echo>
    <jar jarfile="${lib.dir}/${name}.jar" manifest="${build.dir}/info.txt">
        <fileset dir="${build.classes}" includes="com/**"/>
        <fileset dir="META-INF" includes="*.dtd"/>
    </jar>
</target>

주석의 모양도 참고 대상입니다.  타겟의 depends속성을 보면 compile 타겟이 먼저 수행되는 것을 알 수 있습니다. <jar> 태스크를 보면 JAR 파일명이 지정되어 있습니다. 컴파일된 클래스 디렉토리를 기준으로 com 패키지 아래 있는 것이 포함되고, META-INF 디렉토리에 있는 *.dtd 파일들도 jar 파일에 들어갑니다.

compile 타겟을 확인하면 소스의 위치는 확실히 알 수 있겠죠.

<!--  ===================================================================  -->
<!--  Compiles the source code                                             -->
<!--  ===================================================================  -->
<target name="compile-for-java2" depends="prepare,check_for_optional_packages" if="dom3.absent">
    <mkdir dir="${build.classes}" />
    <javac srcdir="src-1.4" destdir="${build.classes}"/>
</target>
<target name="compile" depends="prepare,check_for_optional_packages,compile-for-java2">
    <mkdir dir="${build.classes}" />
    <javac srcdir="${src.dir}" destdir="${build.classes}"
           debug="${debug}" deprecation="${deprecation}" optimize="${optimize}">
        <classpath refid="base.classpath" />
        <exclude name="**/JTidyHTMLParser.java" unless="jtidy.present" />
        <exclude name="**/ScriptFilter.java" unless="nekoHTML.present" />
        <exclude name="**/NekoHTMLParser.java" unless="nekoHTML.present" />
        <exclude name="**/NekoDOMParser.java" unless="nekoHTML.present" />
        <exclude name="**/servletunit/*" unless="jsdk.present" />
        <exclude name="**/JUnitServlet.java" unless="junit.present" />
        <exclude name="**/javascript/*" unless="rhino.present" />
    </javac>
</target>
 
클래스의 빌드 디렉토리를 만든 후에 파일들을 컴파일 합니다. 컴파일 시 관련 jar의 유무에 따라 컴파일에서 제외시키기도 합니다. 여러가지 jar파일들을 사용하는 것을 알 수 있습니다. jtidy, nekoHTML, jsdk, junit, rhino. 대부분 자바스크립트 파서나 실행에 관련된 것들이죠.

httpunit 한 프로젝트에서도 건질 것들이 굉장히 많은 듯 합니다.


findbugs-ant.jar 파일을 $ANT_HOME/lib 에 복사한 뒤에 findbugs task를 사용할 수 있습니다.
파일이 많아지면 timeout이나 memory 이슈가 생길 수 있습니다.

참고용으로 적어봅니다.


        <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
        <target name="findbugs" depends="compile">
                <findbugs home="${findbugs.home}" output="xml" outputFile="findbugs.xml"
                        jvmargs="-Xms512M -Xmx1024M " timeout="1800000">
                        <auxClasspath path="${findbugs.home}/lib/Regex.jar" />
                        <sourcePath path="WebContent/WEB-INF/src" />
                        <class location="WebContent/WEB-INF/classes" />
                </findbugs>
        </target>


조대협님 감사합니다. ^^
http://ant.apache.org

make의 java버전
James Duncan Davidson
Tomcat의 멀티플랫폼 빌드를 위해 만들어짐.

java 작업 자동화의 기본
확장성이 뛰어난 설계로 인해 많은 벤더에서 제품에 추가

xml형식의 빌드 설정 파일
build.xml 이 기본 이름

<project> 최상위
<target> 작업그룹
<task> 수많은 작업 http://ant.apache.org/manual 에서 task 확인 가능
<properties> build.xml 내에서 사용되는 변수

task에는 두 종류가 있음
ant 배포판과 함께 기본적으로 지원되는 core tasks
ant/lib 에 넣고 참조할 다른 jar파일이 필요한 Optional tasks.

설치 방법
압축 풀고, ANT_HOME 환경변수 설정하고 %ANT_HOME%\bin; 을 Path 시스템 환경변수 맨 처음에 추가하면 설치 완료.

cmd창에서 ant -version 으로 설치 확인


Ant와 같이 자기 몸의 50배 이상 일하듯, 작은 빌드 툴이지만 자바를 비롯해서 시스템 작업까지 거의 다 가능함. Another Neat Tool 의 약자.
[kenu@82s ~]$ ls /web/kenu/okjsp.80port.net/
DSC022.JPG    count.jsp  f.jsp        javaone2004/  lecture/  rss/
WEB-INF/      css/       family/      javaone2006/  letter/   slf/
agent.html    cvs/       favicon.ico  ...
[kenu@82s ~]$ cd okjsp2007/
[kenu@82s okjsp2007]$ pwd
/home/kenu/okjsp2007
[kenu@82s okjsp2007]$ ls
CHANGE.txt  README.txt        build.properties.default  docs/  test/
CVS/        build.properties  build.xml                 src/   web/
[kenu@82s okjsp2007]$ cvs update; ant

cvs 서버에서 서비스되는 서버 폴더에 소스를 보내기 전에 cvs와 sync하는 장소가 필요합니다. 이곳을 sandbox 라고 합니다. 여기에서는 /home/kenu/okjsp2007 경로가 sandbox입니다. cvs update 명령을 통해서 새로운 소스들 가져옵니다. ant 명령으로 build.xml 내용을 실행합니다. 이렇게 하면 sandbox의 내용이 서비스되는 경로( /web/kenu/okjsp.80port.net/ )로 보내지게(publish) 됩니다.

어제 세미나에서 미처 보여드리지 못한 내용이라 추가합니다.

+ Recent posts