Oct 29 2007
개인 프로그램에 맞게 Ant 빌드용 build.xml 작성했는데… 좀 더 간단하게 할 수 없을까요?
* 혹시라도 포스트를 보시는 분께서 현자의 모습으로 저의 고민을 해결해 주실 수 있지 않을까 싶어 굳이 존대말로 포스팅합니다. ^^;;
* 디씨인사이드 플밍갤에 올렸는데 많은 도움을 받지는 못해서 제 블로그에 올려 봅니다. 혹시 이런 것을 질문할 만한 커뮤니티나 공간이 있다면 그 곳을 알려주셔도 요긴하게 사용하겠습니다. 일단 먼저 감사드립니다.
* 이 포스트는 질문과 동시에 간단한 빌드 스크립트에 대한 레퍼런스로 활용할 포스트입니다 *
개인적으로 만드는 유틸리티들을 CI를 적용해보려고 이리저리 가지고 노는 중인데, 첫 시작으로 윈도우즈 + eclipse 의존 빌드에서 리눅스 + ant 빌드를 시도 중입니다.
이래저래 구글링을 통해 리눅스에 Ant 설치하고, ant 빌드 스크립트 만드는 건 성공했는데…
완성된 빌드 스크립트 xml 파일을 보니까 왠지 조잡해 보이고, ant에 대해 좀 더 알면 정리가 좀 될 수 있는 부분이 있지 않을까 싶네요.
아래는 순수 검색으로만 정보를 얻어 만든 (즉, 대충 짠) 빌드 스크립트입니다.
build.xml 내용 열기..
<!– Program Info Section –>
<property name=”author” value=”Heart”/>
<property name=”jar.name” value=”QueryTestMulti.jar”/>
<property name=”main.class” value=”net.heartsavior.dev.querytest.main.QueryTestMultiMain”/>
<!– Environment(Dir) Section –>
<property name=”src.dir” value=”src”/>
<property name=”build.dir” value=”bin”/>
<property name=”dist.dir” value=”dist”/>
<property name=”lib.dir” value=”lib”/>
<property name=”dist.lib.dir” value=”${dist.dir}/lib”/>
<!– Environment(Library Dependency) Selection –>
<property name=”commons-dbcp.jar” value=”./${lib.dir}/commons-dbcp-1.2.2.jar”/>
<property name=”commons-pool.jar” value=”./${lib.dir}/commons-pools-1.3.jar”/>
<property name=”jtds.jar” value=”./${lib.dir}/jtds-1.2.1.jar”/>
<property name=”junit.jar” value=”./${lib.dir}/junit.jar”/>
<property name=”ojdbc.jar” value=”./${lib.dir}/ojdbc14.jar”/>
<property name=”manifest-class-path” value=”${commons-dbcp.jar}
${commons-pool.jar} ${junit.jar} ${ojdbc.jar} ${jtds.jar}”/>
<path id=”main.classpath”>
<!–
I don’t need this fileset block, because manifest’s “Class-Path” attribute doesn’t support fileset.
So I manually type all dependency library…
I can’t sure this thing… Is that Ant’s limitation?
(2007.10.29, Heart)
–>
<!–
<fileset dir=”${lib.dir}”>
<include name=”*.jar”/>
</fileset>
–>
<!– Manually Type All Dependency Lib… –>
<pathelement path=”${commons-dbcp.jar}”/>
<pathelement path=”${commons-pool.jar}”/>
<pathelement path=”${jtds.jar}”/>
<pathelement path=”${junit.jar}”/>
<pathelement path=”${ojdbc.jar}”/>
<pathelement path=”${build.dir}”/>
</path>
<target name=”init”>
<mkdir dir=”${build.dir}”/>
<mkdir dir=”${dist.dir}”/>
<mkdir dir=”${dist.lib.dir}”/>
</target>
<target name=”compile” depends=”init” deion=”Compile App.”>
<javac srcdir=”${src.dir}” destdir=”${build.dir}”>
<classpath refid=”main.classpath”/>
</javac>
</target>
<target name=”dist” depends=”compile” deion=”Make distribute Jar File”>
<jar destfile=”${dist.dir}/${jar.name}” basedir=”${build.dir}”>
<manifest>
<attribute name=”Built-By” value=”${author}”/>
<attribute name=”Main-Class” value=”${main.class}”/>
<attribute name=”Class-Path” value=”${manifest-class-path}”/>
</manifest>
</jar>
<!– copy library files to distribute directory –>
<copy todir=”${dist.lib.dir}”>
<fileset dir=”${lib.dir}”>
<!– include: avoid .svn diretory –>
<include name=”**/*.jar”/>
</fileset>
</copy>
</target>
<target name=”clean” depends=”init” deion=”Clean intermediate files”>
<delete includeEmptyDirs=”true”>
<fileset dir=”${build.dir}”/>
<!– excludes: for windows batch file –>
<fileset dir=”${dist.dir}” excludes=”*.bat”/>
<fileset dir=”${dist.lib.dir}”/>
</delete>
</target>
</project>
프로젝트 환경에 대해 짧게 정리하자면…
디렉토리는 lib/ src/ dist/ bin/ 가 있습니다.
lib/ 에는 의존 라이브러리(jar)들이 있고, src/ 에는 소스 파일들이 있고,
dist/ 에는 windows에서 편의상 쓰는 bat 파일들이 있고(이건 생성되는건 아니고…), 만들어진 jar 파일이랑 의존 라이브러리를 ant를 통해 위치시키도록 해 뒀고(이건 생성 혹은 복사되는거),
bin/ 에는 빌드된 class 파일들이 위치하도록 해 두었습니다.(이것도 생성되는거).
build.xml파일은 (당연한 말이겠지만) 프로젝트 루트에 있습니다.
빌드파일 분할 없이 하나의 빌드 파일이구요… (아직 하는 방법도 모르고, 쪼개는 게 실용적인지, 하나로 쓰는게 실용적인지 모르겠네요… 이것도 방법에 대한 추천 부탁드립니다.)
정리안된건 그렇다 치고, 생각대로 안되는게 하나가 있습니다.
jar
manifest 파일 자동생성에 Class-Path를 lib/*.jar 파일로 넣어 주고 싶은데…(Jar 상태로 실행 가능할 수 있도록 말이죠.) 이건 자동으로 할 수 있는
방법을 찾질 못했습니다.
컴파일 classpath는 <path> 쓰면 되는데 Class-Path는 이래저래 넣어봐도
안되어서…
이거 manifest-class-path 프로퍼티처럼 하지 않고, <path> 사용한 것처럼 자동으로 넣는 방법이 있나요?
그리고 나중에는 이걸 SVN에서 통째로 체크아웃 받아서 자동빌드 하려고 하는데…
지금 나와있는 오픈소스 CI 서버중에 SVN 체크아웃해서 ANT로 빌드하는 프로세스를 가장 깔끔하게 지원하는 것은 어떤게 있나요? 혹시 Trac에 자동 티켓팅이 되는 것도 있을까요?
고수분들의 많은 관심 부탁드립니다.(그나저나 포스팅으로 질문하는 건 처음이군요 @_@)
