2007년 03월 15일
Eclipse Workspace Refresh
나는 자바 개발은 주로 Eclipse에서 한다. Eclipse의 기능을 잘 사용하고 있다고 생각해 왔는데 오늘 또 새로운 것을 발견했다. tool의 사용법은 정말 꾸준히 익혀야 하는 것 같다.
개발하다 보면 코드를 생성하는 작업을 해야 할 경우가 종종 있다. javacc로 파서를 생성한다거나 commons attributes를 이용하는 경우 그리고 groovy 같은 스크립트 언어로 가공해서 템플릿에서 클래스를 생성하는 경우 등이 그런 것들이다. 이런 작업은 개발 중에 자주 반복해야 되는 경우도 있고 또 최종 빌드시에도 생성해야 하므로 ant로 작업을 한번에 할 수 있도록 빌드 스크립트를 구성해 두는 게 여러모로 좋다. ant는 관련 자료도 풍부하고, 또 Eclipse에 잘 통합되어 있어서 Eclipse에서 편하게 이용할 수 있기 때문이다.
그러나 Eclipse는 ant 실행이 끝난 후 생성된 코드를 바로 인식하지 못한다. 반드시 workspace를 refresh해야 생성된 코드를 인식하고 compile을 하게 된다(build automatically를 켜 놓은 경우). 이건 의외로 상당히 번거로운 일이 된다.
비록 ant로 실행해서 코드를 생성했어도 refresh하지 않으면 바뀐 코드가 새로 컴파일되지 않기 때문에 바뀐 내용이 적용되지 않는다. 한참 개발하다 이를 모르고 버그가 있는 줄 알고 한참 삽질한 적도 있었다.
예전부터 이 문제를 해결하고자 했었다. google에서 찾은 바로는 eclipse.refreshLocal이라는 ant task를 이용하면 이 문제를 해결할 수 있다고 했다. 그러나 eclipse.refreshLocal task를 넣고 실행하면 정의되지 않은 task라는 에러가 나온다. 검색한 문서에서는 이 task는 eclipse에서 직접 지원하는 task라고 나와 있지만 말이다.
그간 잊고 지내다 오늘은 기필코 이 문제를 해결하겠다는 마음을 먹었다. eclipse.refreshLocal task가 어느 클래스로 구현되어 있는지부터 찾아봤다. 이 task는 org.eclipse.core.resources.ant.RefreshLocalTask로 구현되어 있었고, 엉뚱하게도 이 클래스는 org.eclipse.core.resources_3.x.x.jar 파일에 있었다. ant를 실행할 때 classpath에 포함되는 ant 관련 jar 파일이 아니었던 것이다.
이 클래스를 어떻게 ant 실행 환경에 포함해서 task를 실행시킬까를 궁리했다. 어떻게든 실행시키는 것은 간단한 일이지만 가능하면 손이 덜 가는 방식이어야 했다. 그렇지 않으면 관리를 위해 또 귀찮은 일이 발생할 것이기 때문이다.
계속 google을 찾아 보니 여러 가지를 알 수 있었다. 이 task는 꽤 오래 전에 나왔던 것이고, 그 이전에 나와 같은 문제로 고민했던 적도 있었다. 그 해결책 중 하나가 이런 종류의 task였던 것이다. 그러나 어쩐 일로 이 task는 빠지게 된 것이다. 이런 문서들을 읽다가 문득 한 생각이 떠올랐다.
혹시 ant 실행시에 workspace refresh를 설정할 수 있는 게 아닌가 하는 거였다. 아니나 다를까 ant 실행 대화 상자에 이에 대한 설정 옵션이 있었다. ant 실행 후 refresh를 하는지 여부를 선택할 수 있고, refresh할 대상도 지정할 수 있는 것이다.

해결책을 알고 나니 좀 허탈했다. 그러나 한편으로 생각해 보니 그간 나는 GUI를 하찮게 여기는 경향이 있었던 것 같다. 이번에도 문제 해결을 ant script 쪽으로 잡았다. 그러나 결과는 아주 간단히 해결할 수 있었던 것이었다. 평소 대화 상자를 조금만 주의깊게 봤으면 금세 해결할 문제였던 거다.
새삼스럽게 아직도 내가 Eclipse에 대해 모르고 있는 것이 많다는 것을 느낀 하루였다.
개발하다 보면 코드를 생성하는 작업을 해야 할 경우가 종종 있다. javacc로 파서를 생성한다거나 commons attributes를 이용하는 경우 그리고 groovy 같은 스크립트 언어로 가공해서 템플릿에서 클래스를 생성하는 경우 등이 그런 것들이다. 이런 작업은 개발 중에 자주 반복해야 되는 경우도 있고 또 최종 빌드시에도 생성해야 하므로 ant로 작업을 한번에 할 수 있도록 빌드 스크립트를 구성해 두는 게 여러모로 좋다. ant는 관련 자료도 풍부하고, 또 Eclipse에 잘 통합되어 있어서 Eclipse에서 편하게 이용할 수 있기 때문이다.
그러나 Eclipse는 ant 실행이 끝난 후 생성된 코드를 바로 인식하지 못한다. 반드시 workspace를 refresh해야 생성된 코드를 인식하고 compile을 하게 된다(build automatically를 켜 놓은 경우). 이건 의외로 상당히 번거로운 일이 된다.
비록 ant로 실행해서 코드를 생성했어도 refresh하지 않으면 바뀐 코드가 새로 컴파일되지 않기 때문에 바뀐 내용이 적용되지 않는다. 한참 개발하다 이를 모르고 버그가 있는 줄 알고 한참 삽질한 적도 있었다.
예전부터 이 문제를 해결하고자 했었다. google에서 찾은 바로는 eclipse.refreshLocal이라는 ant task를 이용하면 이 문제를 해결할 수 있다고 했다. 그러나 eclipse.refreshLocal task를 넣고 실행하면 정의되지 않은 task라는 에러가 나온다. 검색한 문서에서는 이 task는 eclipse에서 직접 지원하는 task라고 나와 있지만 말이다.
그간 잊고 지내다 오늘은 기필코 이 문제를 해결하겠다는 마음을 먹었다. eclipse.refreshLocal task가 어느 클래스로 구현되어 있는지부터 찾아봤다. 이 task는 org.eclipse.core.resources.ant.RefreshLocalTask로 구현되어 있었고, 엉뚱하게도 이 클래스는 org.eclipse.core.resources_3.x.x.jar 파일에 있었다. ant를 실행할 때 classpath에 포함되는 ant 관련 jar 파일이 아니었던 것이다.
이 클래스를 어떻게 ant 실행 환경에 포함해서 task를 실행시킬까를 궁리했다. 어떻게든 실행시키는 것은 간단한 일이지만 가능하면 손이 덜 가는 방식이어야 했다. 그렇지 않으면 관리를 위해 또 귀찮은 일이 발생할 것이기 때문이다.
계속 google을 찾아 보니 여러 가지를 알 수 있었다. 이 task는 꽤 오래 전에 나왔던 것이고, 그 이전에 나와 같은 문제로 고민했던 적도 있었다. 그 해결책 중 하나가 이런 종류의 task였던 것이다. 그러나 어쩐 일로 이 task는 빠지게 된 것이다. 이런 문서들을 읽다가 문득 한 생각이 떠올랐다.
혹시 ant 실행시에 workspace refresh를 설정할 수 있는 게 아닌가 하는 거였다. 아니나 다를까 ant 실행 대화 상자에 이에 대한 설정 옵션이 있었다. ant 실행 후 refresh를 하는지 여부를 선택할 수 있고, refresh할 대상도 지정할 수 있는 것이다.

해결책을 알고 나니 좀 허탈했다. 그러나 한편으로 생각해 보니 그간 나는 GUI를 하찮게 여기는 경향이 있었던 것 같다. 이번에도 문제 해결을 ant script 쪽으로 잡았다. 그러나 결과는 아주 간단히 해결할 수 있었던 것이었다. 평소 대화 상자를 조금만 주의깊게 봤으면 금세 해결할 문제였던 거다.
새삼스럽게 아직도 내가 Eclipse에 대해 모르고 있는 것이 많다는 것을 느낀 하루였다.
# by | 2007/03/15 21:35 | 트랙백 | 덧글(1)
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.




















