Oct 29 2007

개인 프로그램에 맞게 Ant 빌드용 build.xml 작성했는데… 좀 더 간단하게 할 수 없을까요?

분류: Dev.Think 태그: ,, , , , , Heart @ 2:20 오후

Trackback : http://dev.heartsavior.net/archives/71/trackback/

* 혹시라도 포스트를 보시는 분께서 현자의 모습으로 저의 고민을 해결해 주실 수 있지 않을까 싶어 굳이 존대말로 포스팅합니다. ^^;;
* 디씨인사이드 플밍갤에 올렸는데 많은 도움을 받지는 못해서 제 블로그에 올려 봅니다. 혹시 이런 것을 질문할 만한 커뮤니티나 공간이 있다면 그 곳을 알려주셔도 요긴하게 사용하겠습니다. 일단 먼저 감사드립니다.

* 이 포스트는 질문과 동시에 간단한 빌드 스크립트에 대한 레퍼런스로 활용할 포스트입니다 *

개인적으로 만드는 유틸리티들을 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에 자동 티켓팅이 되는 것도 있을까요?

고수분들의 많은 관심 부탁드립니다.(그나저나 포스팅으로 질문하는 건 처음이군요 @_@)


Oct 29 2007

IE7이 11월 6일날 정품인증 없이 자동 배포된다네…

분류: Dev.Think 태그: ,, , , Heart @ 1:33 오후

Trackback : http://dev.heartsavior.net/archives/72/trackback/

@ 인터넷익스플로러7, 자동으로 배포

내가 웹 프로그래머는 아니지만(잠깐 알바는 했지만서도)…
IE6랑 IE7이 자바스크립트 단에서 달라서(IE7쪽이 웹표준을 최대한 지키는 방향) 자바스크립트에 의존적인 웹 사이트들은 작업이 꽤 있을 것이라고 들었는데…(딴 분이 자바스크립트는 아주 큰 차이는 없고 html/css가 많이 다르다고 하네… 아무튼…)
그래도 IE7 출시 시기에 개발자들에게 한 줄기 위안이었던 게, 정품 사용자들만 업데이트 가능… 이었다.

근데, 11월 6일부터는 불법 사용자들도 업데이트 가능(이라기보다 강제 업데이트)으로 변경된다고 하니,
웹 프로그래머들의 수난의 날이 다시 도래하는 것일지도 모르겠다.

MS는 애초에 IE6때도 웹표준을 지키던가… 아님 아예 웹표준을 무시하고 쭉 가던가…
비스타도 개발 회사 입장에서는 미칠 지경인데…

아무튼 대단한 회사다. 이렇게 많은 개발 회사들에게 일거리를 별 말 안하고 부여해주는 센스를 보여주는구나.


Oct 26 2007

오라클 인스턴트 클라이언트 ODBC 10.2 버전 문제가 많은 듯…

분류: TroubleShooting 태그: ,, , Heart @ 1:13 오후

Trackback : http://dev.heartsavior.net/archives/73/trackback/

문제점 1. VC에서 Debug로 돌리면 오라클 ODBC 드라이버 첫 호출에 바로 Heap 예외가 떨어짐
문제점 2. 그 이유인지는 몰라도 이후 SQLDriverConnect()로 연결이 안됨… ODBC 수동 설정으로 TNS 잡혔는지 전부 확인했지만 안됨

처음에는 ‘내가 잘못했겠지’ ‘설마 오라클이…’ 해서 구글링도 하고 이것저것 자료 찾아보고, 커넥션 스트링도 네다섯 개 바꿔가면서 시도해 보았는데, 위의 두 문제점은 해결될 기미가 보이질 않았다.

데이터를 찾는 중에 다른 문제도 발견했는데, 드라이버 DLL 구동에 필요한 MFC DLL(버전 7.1)이 포함되지 않아서 DLL이 없는 경우 에러가 발생한다고 한다. (본인은 VS.net 2005도 설치되어 있는 상태라 에러가 나지 않았다.)

……

테스트는 해 보고 내놓은거냐 -_-

아무튼, 이걸로 하루 업무량을 날렸다.
다음날, ‘이건 분명 드라이버 문제다’ 라고 생각하고 오라클 인스턴트 클라이언트를 10.1로 교체했다.
베이직, JDBC, ODBC 전부…

제길… 아주 잘 돌아간다. DSN 등록할 때 드라이버명만 10.1과 맞게 맞춰주니 Heap예외도 없고, 접속도 잘 된다.

베타도 아니고 배포 버전에 이런 중대한 버그가 있는 건 오라클의 명성과는 참 상반되는 이야기인 것 같다.
(오라클이 국내 중소기업도 아니고… 테스트도 안해보고 내놓은건지 원…)
게다가 일반 유틸리티도 아니고 드라이버에 이런 문제가 있으면 이걸로 개발하는 사람들은 뭐가 되는건지…

Heap 문제는 오라클 포럼을 보니 metalink에 패치가 올라온 것 같은데, metalink는 오라클과 계약관계인 기업만 ID부여가 된다.

일반 사용자는 뭐가 되는거냐?  다운로드 페이지에 10.2 버전 ODBC에 문제가 있다고 공지라도 하던지…

그냥 하루 날린 기념으로 끄적대 보았다.
결론은,

10.2 버전 JDBC는 잘 되고, ODBC만 문제가 있으니 ODBC 사용하실 분은 10.1 set으로 맞추세요.


뒷 쪽 »