2009-10-27

ant와 씨름하기

회사에서 사용하는 빌드 서버 디스크가 고장나면서 빌드를 다시 구성해야 했는데 처음 구성했을 때 문서로 잘 정리해 놓지 않아서 고생했다.

우선 우분투 서버 8.0.4를 다시 설치했고... 여러 가지 작업을 했는데 그 중에서 ant와 관련한 부분을 정리해봤다.

apt로 ant로 설치했는데 ant 버전은 1.7.0이었다.

sudo apt-get install sun-java5-jdk
sudo apt-get install ant


ftp 태스크를 사용하려면 ANT_LIB(/usr/shared/ant/lib) 디렉토리에 다음 파일들을 추가한다.

ant-commons-net.jar
commons-net-1.4.1.jar

* apt로 설치하면 ant-commons-net.jar 파일이 포함되지 않기 때문에 별도로 설치해주어야 한다.


MailLogger를 사용했는데 이게 문제가 많았다. MailLogger를 사용하려면 다음과 같이 ant를 실행해야 한다.

ant -logger org.apache.tools.ant.listener.MailLogger -DMailLogger.properties.file=mail.properties


일단 어떤 문제가 있는지를 잘 알 수가 없었다. -v 옵션과 -diagnostics 옵션을 사용해야 그나마 의미있는 정보를 알 수가 있었다.

그리고 메일 발송을 위해서 다음 파일들을 추가해야 했다.

mail.jar
activation.jar

이 파일들을 먼저 설치하지 않으면 무슨 문제가 있는지 알 수가 없다. 이 파일들이 필요하다는 메시지가 없었다.

설정을 별도의 파일(mail.properties)에 해야 했다. 그렇지 않으면 예외가 발생한다.

# mail.properties
# gmail을 사용

MailLogger.mailhost=smtp.gmail.com
MailLogger.port=465
MailLogger.ssl=true
MailLogger.user=mailer@company.com
MailLogger.password=password
MailLogger.from=mailer@company.com
MailLogger.success.to=to@company.com
MailLogger.success.subject=Build Success
MailLogger.failure.to=admin@company.com,builder@company.com
MailLogger.failure.subject=Build Failure


이후에도 java.lang.NullPointerException이 발생한다. 예외가 발생하는 소스 코드 위치는 다음과 같다.

org.apache.tools.ant.taskdefs.email.MimeMailer.java 206번째 줄

for (Iterator iter = headers.iterator(); iter.hasNext();) {
  Header h = (Header) iter.next();
  msg.addHeader(h.getName(), h.getValue());
}

headers는 상위 클래스(Mailer.java)에 있는 멤버 필드인데 null로 초기화가되어 있다.

그래서 이 코드를 다음과 같이 수정해야 한다.

if (headers != null) {
  for (Iterator iter = headers.iterator(); iter.hasNext();) {
    Header h = (Header) iter.next();
    msg.addHeader(h.getName(), h.getValue());
  }
}

그리고 이 코드만을 컴파일하여 _ant.jar 파일로 묶어서 ANT_LIB 디렉토리에 복사한다.

* 이클리스에서 사용하는 ant 버전은 1.7.1이었는데 여기서도 동일한 예외가 발생했다.



No comments: