이 씨리즈의 문서는 이클립스 피쳐 프로젝트를 자동 빌드하고, 서명, 업데이트 사이트 및 리포지터리를 자동으로 업데이트 하는 방법을 익히게 하는 것을 목적으로 합니다. 초보적인 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} 입니다.

이제 이 타깃을 실행 해 봅시다. 현재 실행중인 이클립스의 위치가 보인다면 잘 따라오고 계신겁니다 :)

플러그인 빌드 하기

하나의 플러그인이 빌드 되는 과정은 매우 단순합니다.

  1. 플러그인 디펜던시에 있는 모든 플러그인과, 그 플러그인들의 디펜던시를 모두 얻어 클래스 패스에 추가한 상태로, 모든 자바 파일을 컴파일 한다
  2. build.properties 및 manifest.mf 파일의 내용에 따라, 컴파일 결과물 및 리소스를 jar파일에 집어 넣는다.
  3. 필요한 경우 완성된 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로 부터 모든 플러그인을 자동빌드하고 피쳐역시 빌드하는 방법과, 찌꺼기 파일들을 안전하게 제거하는 방법에 대해 알아보겠습니다.

좋아요를 누르지 않으면 이 씨리즈의 다음 문서가 업데이트 되지 않을 수도 있습니다.

Posted by 지이이이율
,