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으로 갈아탈 준비중입니다.

내일 강의에서 빌드에 대한 얘기가 있습니다. 빌드는 컴파일의 확장이다 라고 처음에 썼다가 너무 막연해서 구글링을 해 보았습니다. 델파이 툴의 메뉴 경험담이 처음으로 나왔고, 조엘 아저씨 사이트의 토론 게시판이 눈에 들어왔습니다. 나름 이렇게 설명하면 좋겠다 하는 부분도 있구요.

Build usually means the entire process of getting a system ready for use.
빌드는 보통 사용할 준비가 된 시스템으로 만드는 프로세스 전체를 뜻한다.

Compile is usually an action on a single file or group of files. The output of a compile step might be an executable or an object file or even a library of some sort.
컴파일은 한 파일 또는 파일 그룹을 대상으로 행해진다. 컴파일의 산출물은 보통 실행파일이나 오브젝트 파일 또는 어떤 라이브러리가 될 수도 있다.

Sometimes there is another step after build, to prepare a system for distribution.
때때로 배포를 위한 시스템을 준비하기 위해 빌드 이후에 다른 단계가 있기도 하다.

from: http://discuss.joelonsoftware.com/default.asp?joel.3.184483.14

인용한 부분의 설명이 마음에 듭니다. 베타 버전에는 흔히 빌드 번호가 노출이 됩니다. 빌드 번호라고 하지 컴파일 번호라고 붙이지는 않지요.

하지만 설명이 쉽지는 않군요. ㅡㅡ;

앞서 오픈소스인 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 한 프로젝트에서도 건질 것들이 굉장히 많은 듯 합니다.

+ Recent posts