이 씨리즈의 문서는 이클립스 피쳐 프로젝트를 자동 빌드하고, 서명, 업데이트 사이트 및 리포지터리를 자동으로 업데이트 하는 방법을 익히게 하는 것을 목적으로 합니다. 초보적인 Ant이해를 가진 이클립스 플러그인 개발자를 대상으로 합니다.
ANT 파일 만들기
우선 빌드를 위한 빈 자바 프로젝트를 HelloAntBuild라는 이름으로 만듭니다. 자바 프로젝트로 만드는 이유는, Ant스크립트로 처리할 수 없는 일괄작업을 Java로 기술해야만 하는 경우를 대비하기 위해서 입니다.
그리고 HelloAnt.build.xml 라는 파일을 만들고 다음의 내용을 입력합니다:
Hello Ant!
XML 또는 텍스트 에디터를 닫고, 이 파일을 Ant Editor로 엽니다. 아웃라인 뷰에서, build를 우클릭한 뒤, [Run As] / [Ant Build] 를 차례로 선택하여, 화면에 Hello Ant!가 잘 찍히는 지 확인합니다.
수행결과
Eclipse Ant Task 사용하기
이클립스에서는 Ant에서 사용할 수 있는 유용한 태스크 태그(동작)와 프로퍼티(변수)들을 공급합니다. 단, 이를 사용하기 위해서는 앤트가 실행중인 이클립스와 동일한 JVM에서 수행되어야 합니다. 아웃라인 뷰에서 build를 우클릭한 뒤, [Run As] / [Ant Build ...] 을 선택하여, 앤트 실행 구성 편집기를 엽니다.
JRE 탭에서 Run in the Same JRE as the workspace를 선택합니다.
이 앤트 파일의 실행 구성을 팀원들과 공유하기 위하여, Common 탭 Save as 항목에서 실행 구성이 저장될 위치 (워크 스페이스 내 현재 프로젝트)를 선택해 줍니다. 앞으로 이 프로젝트를 체크아웃 받아 빌드를 실행하는 다른 사람도, 자동으로 이 실행 구성을 이용하게 됩니다.
이제 Run 또는 Debug 버튼을 눌러 앤트를 실행시켜보면, 이전과 마찬가지 실행결과를 보여주지만, 네비게이터를 살펴보면 프로젝트 안에 "프로젝트이름 HeloAnt.build.xml.launch" 라는 파일이 하나 생겨 있을 것입니다. 이 파일이 앤트 실행 구성을 담고 있습니다.
이클립스 프로퍼티 사용해 보기
앤트 파일을 다시 열고, 다음의 내용을 추가합니다:
현재 실행중인 이클립스의 위치는 ${eclipse.home.location} 입니다.
이제 이 타깃을 실행 해 봅시다. 현재 실행중인 이클립스의 위치가 보인다면 잘 따라오고 계신겁니다 :)
플러그인 빌드 하기
하나의 플러그인이 빌드 되는 과정은 매우 단순합니다.
- 플러그인 디펜던시에 있는 모든 플러그인과, 그 플러그인들의 디펜던시를 모두 얻어 클래스 패스에 추가한 상태로, 모든 자바 파일을 컴파일 한다
- build.properties 및 manifest.mf 파일의 내용에 따라, 컴파일 결과물 및 리소스를 jar파일에 집어 넣는다.
- 필요한 경우 완성된 jar 파일을 서명
말은 쉽지만, 1번 단계부터 막막할 겁니다.
build.properties와, manifest.mf파일을 자동으로 분석해서 해야할 일을 자동으로 생성해 주는 녀석이 있다면 아주 편리하겠죠? 다행히 eclipse.buildScript 라는 태스크가 그 일을 지원합니다. 우리는 이 태스크 태그를 이용하여, 플러그인을 빌드하는 스크립트를 생성 한 뒤에 실행 할 것입니다. 이 전략을 그림으로 그려보면 다음과 같습니다:
Main Script -> Sub Script* : generate Sub Script* -> Sub Script* : run Main Script -> Sub Script* : delete
연습용 플러그인 만들기
이제 자동빌드를 연습해볼 마루타 프로젝트인 HelloAntPlugin 플러그인 프로젝트를 하나 만듭니다. 특별히 아무런 구현이나 내용이 없어도 됩니다.
플러그인 프로젝트를 만들었으면, 빌드 프로젝트의 HelloAnt.build.xml을 다시 열어 build-plugin-test라는 타깃을 앤트파일에 추가하고 아래의 내용을 채워 넣으세요:
<eclipse.buildScript elements="plugin@HelloAntPlugin" baselocation="${eclipse.home}" builddirectory="${basedir}/../" /> <eclipse.refreshLocal resource="/" depth="infinite" />
eclipse.buildscript 태스크는 다음과 같은 속성을 가집니다:
- elements : 앤트 빌드 스크립트를 생성할 대상. 타입@ID 형태로 지정합니다. 우리가 빌드할 것은 플러그인이고, 아이디는 HelloAntPlugin이므로 plugin@HelloAntPlugin이 됩니다.
- baselocation : 대상을 빌드하는데 필요한 디펜던시를 어디에서 부터 얻을지 알려줍니다. 설치된 이클립스의 경로를 알려줬습니다. 개발 타겟이 다른경우, 이곳에 타겟 이클립스의 경로를 지정하면 됩니다.
- builddirectory : 빌드 대상 요소를 찾는 공간을 의미합니다. ${basedir}은 기본값으로 실행될 앤트파일이 담긴 디렉토리가 되는데, 그것의 부모폴더로 기술했으므로 워크스페이스의 위치가 될 것입니다. (빌드 프로젝트의 부모는 워크스페이스이므로)
나머지 자세한 속성들은 이클립스 온라인 도움말에서 확인하십시오.
eclipse.refreshLocal 태그는 워크스페이스를 갱신하는 역할을 합니다. 앤트는 이클립스와 독립적인 플랫폼이어서 IResource를 이용하여 작업하지 않습니다. 표준 File API 나 커맨드 라인 명령도구를 이용하므로, 워크스페이스의 싱크가 깨집니다. 빌드 작업이 끝나면 꼭 이 태스크 태그를 이용하여 워크스페이스를 갱신 시켜 주어야 합니다.
새로 추가한 타겟을 실행해 보면, HelloAntPlugin 프로젝트 밑에 build.xml 과 javaCompiler...args 파일이 추가된 것을 알 수 있습니다.
생성된 스크립트 실행 해 보기
생성된 build.xml을 열어 보면 뒷골이 당겨 올 겁니다. 이 앤트스크립트를 역공학 하실 수 있는 분은 시도해 보시기 바랍니다.
생성된 build.xml을 열어서, 아웃라인 뷰에서 "@dot"를 선택하고 우클릭 한 뒤, [Debug As] / [Ant Build ...]을 선택 한 뒤, 실행 구성에서 앞서 말씀드린 것 처럼 Workspace 와 동일한 JRE를 사용하게 한 상태에서 실행 해 봅시다. 이 타깃은 소스를 컴파일 하는 역할을 합니다.
실행이 끝나면 이번에는 build.update.jar를 선택 한 뒤 다시 실행합니다.
실행이 완료되면, 플러그인 프로젝트를 우클릭 하고, [Refresh]를 선택하여 워크스페이스를 갱신합니다. eclipse.buildScript가 생성한 스크립트는 무인 실행용이어서, 사람이 결과물을 확인하지 않기 때문에 eclipse.refreshLocal을 자동으로 호출해주지 않습니다. 워크스페이스를 갱신해보면 위 그림처럼, 플러그인이 빌드된 jar파일과, 각 컴파일된 자바 클래스 파일이 구조대로 담긴 @dot 폴더가 생겼을 것입니다.
지금은 우리가 생성된 스크립트를 사람 손으로 실행 했지만, 이번에는 메인스크립트가 스크립트를 생성한 뒤 자동으로 실행하게 해 봅시다.
다른 스크립트 호출하기
이제 원래 빌드프로젝트로 돌아와 HelloAnt.build.xml을 다시 열고 build-plugin-test-2라는 타깃을 만들고 다음의 내용을 추가합니다:
스크립트 생성중 <eclipse.buildScript elements="plugin@HelloAntPlugin" baselocation="${eclipse.home}" builddirectory="${basedir}/../" />스크립트 실행중 <ant antfile="../HelloAntPlugin/build.xml" target="@dot" inheritall="false" /> <ant antfile="../HelloAntPlugin/build.xml" target="build.update.jar" inheritall="false" /> <eclipse.refreshLocal resource="/" depth="infinite" />
ANT 태스크 태그
ant 태그의 속성은 매우 직관적입니다. antfile은 실행할 팔일을, 그리고 타깃을 지정했습니다. inheritall의 값으로 false를 줬는데, 이것은 메인스크립트에 선언된 프로퍼티를 호출될 스크립트에게 전달하겠느냐는 의미가 됩니다. 자식스크립트는 ${basedir}이 자기자신이 있는 곳이라고 생각하고 작성되었을 것이기 때문에, 보통은 프로퍼티를 상속해 주는 것은 위험합니다. 명시적으로 필요한 속성만 상속하는 것이 좋습니다. 이 방법은 나중에 소개합니다.
새로만든 타깃을 실행 해 보면, 플러그인 프로젝트 밑에 jar가 생성되는 것을 확인 할 수 있습니다.
수고하셨습니다, 다음 시간에는 feature.xml로 부터 모든 플러그인을 자동빌드하고 피쳐역시 빌드하는 방법과, 찌꺼기 파일들을 안전하게 제거하는 방법에 대해 알아보겠습니다.
좋아요를 누르지 않으면 이 씨리즈의 다음 문서가 업데이트 되지 않을 수도 있습니다.
'PDE' 카테고리의 다른 글
특정 셀렉션을 바탕으로 남이 만든 커맨드의 비즈니스 로직 호출하기 (0) | 2011.04.14 |
---|---|
이클립스 플러그인에 DLL 포함시키기 (0) | 2010.12.10 |
제품 빌드시 자주 발생하는 문제들 (0) | 2010.11.26 |
Bundle과 Resource (0) | 2010.10.28 |
네이쳐와 빌더 (0) | 2010.10.15 |