Scala, Eclipse, Maven2, JUnit4, specs 연동

주의: Java 방면 기술인 Eclipse나 Maven2, JUnit4는 이제 성숙기에 접어들어서 별 탈이 안 나지만, Scala에 관련된 쪽은 버전업이 자주 되고 있습니다. Scala 2.7.6이 나와서 다시 해봤는데 글 쓴 내용대로 잘 안 됩니다-_-; Eclipse 연동 쪽은 보지 마시고 Maven2 프로젝트를 만들겠다면 참고만 하세요.

이 글을 검색하신 분들은 제목에 나온 것들이 뭐하는 건지 잘 아신다고 가정하고 글을 쓰겠습니다 :)

0. 윈도 아래, Eclipse 3.5와 Maven 2.2.1이 설치되었고 Maven 2.2.1을 명령행 아무데서나 쓸 수 있는 상태라고 합시다. 이 상태에서...

1. Scala Eclipse Plugin을 설치합니다. Eclipse 3.5 기준으로 Help > Install New Software를 사용하고, 플러그인 주소로는 http://www.scala-lang.org/scala-eclipse-plugin를 입력합니다. 이 글을 쓰는 시점에 안정 버전은 2.7.5입니다.
사용자 삽입 이미지
자칭 안정 버전이긴 한데 아직 눈에 띄어서 매우 거슬리는 버그는 좀 있습니다.

2. Maven2를 사용해서 프로젝트를 만듭니다. Maven2에서 Scala 템플릿을 제공하긴 하지만 아직 eclipse:eclipse 플러그인이 Scala 지원을 제대로 못해서 바로 쓸 수가 없습니다. 어쩔 수 없이 Java 프로젝트를 만들고 점차 Scala로 붙이는 방식을 써야 합니다.

명령행 : > mvn archetype:generate

이러면 여러 템플릿이 나옵니다. 가장 간단하게 15번 quickstart 템플릿을 사용합니다. 각종 id나 버전을 물어보는데 취향대로 정해주세요.

3. 탐색기에서 src/test/java 디렉토리와 src/main/java 디렉토리를 각각 src/test/scala와 src/test/scala로 이름을 바꿉니다. 안의 java 파일은 지웁시다.

4. 간단한 specs 테스트를 작성해서 src/test/scala 디렉토리에 넣습니다. 사실 Scala고 specs고 어떻게 돌아가는지 거의 모르지만(...) 그냥 실패하는 테스트를 작성하도록 하겠습니다. 손에 익은 에디터를 써서 만들면 되고... 패키지 이름이나 클래스 이름 정도는 2번에서 자기가 정한 대로 바꿔주시리라 믿습니다. 그리고 Scala는 클래스 이름과 파일 이름이 똑같지 않아도 괜찮지만, 이 예에서는 Maven2를 사용해서 점검을 하기 때문에 테스트 클래스 이름 끝에 Test를 꼭 붙여야 합니다. Scala나 JUnit4와는 아무 상관없습니다.

package group
import org.specs._
import org.specs.runner._
class FirstSpecsTest extends Specification with JUnit {
  "First Fail!" should {
    "1 != 2" in {
      1==2 must beTrue
    }
  }
}

4. 이제 pom.xml을 고쳐야 합니다. 역시 완벽히 이해한 것이 아니라 설명은 힘들고(...), 제가 고친 pom.xml 파일을 예제로 올려놓도록 하겠습니다. pom.xml을 수정한 다음 mvn clean test를 입력하여 위 테스트가 실패하는지 확인합시다.

pom.xml

사용자 삽입 이미지
5. 이제 Maven2 프로젝트를 Eclipse에서 사용할 수 있도록 변환해야 합니다. mvn eclipse:clean eclipse:eclipse를 입력합니다.

6. Eclipse에서 해당 프로젝트를 Import합니다. File > Import > Existing projects into Workspace를 사용하고 프로젝트가 있는 폴더를 고릅니다. Import가 끝나면 라이브러리 참조가 안 된다고 할 수도 있는데... 7을 보세요.

7. Eclipse에서 Maven2에 의존하는 라이브러리를 찾지 못할 수 있습니다. 그렇다면 M2_REPO 변수를 지정하여 의존성을 확실히 인식시켜야 합니다.

Project > Properties > 트리에서 Java Build Path 선택
Libraries 탭 선택 > Add Variable > Configure Variables...
여기서 M2_REPO 변수와 해당 경로를 지정합시다. 별도로 Maven2 설정을 바꾸지 않았다면 Windows XP 기준으로 C:\Documents and Settings\(사용자 이름)\.m2\repository 폴더일 것입니다.

8. 이제 Eclipse에서 Java로 JUnit4 테스트를 만들어서 편하게 실행했던 것처럼 Scala도 그랬으면 좋겠는데... 불가능한 건 아니지만 문제가 좀 있습니다.

먼저 Maven2에 라이브러리 의존성을 추가해서 mvn eclipse:eclipse로 프로젝트를 갱신할 때마다 이 설정이 사라집니다. maven-eclipse-plugin에서 설정을 해줄 수 있었으면 좋겠는데 안 되더군요-_-;

두 번째는 테스트 클래스가 제때 갱신이 안된다는 겁니다. specs 테스트를 없앴을 때 컴파일되는 결과에까지 바로 반영되지 않았는데, Eclipse에서 clean을 직접 해줘야 합니다.

아무튼 이리 불편해도 mvn test로 결과를 보는 것보다는 낫겠죠.

사설이 길었습니다. 다음과 같이 하면 됩니다.

Project > Properties > 트리에서 Java Build Path 선택
Libraries 탭 선택 > Add External Class Folder...
classes 파일이 들어가는 폴더를 고릅니다. 제 경우엔 target/classes 폴더였음.
Order and Export 탭 선택 > 앞서 지정한 classes 폴더를 맨 위로 올립니다.

이러면 끝. 그리고 clean과 refresh를 해줍시다.

8 추가) 이 문제는 Scala Eclipse Plugin에서 빌드할 때 설정을 무시하고 컴파일 결과를 무조건 기본 classes 폴더에만 저장을 하기 때문에 벌어집니다. Maven2야 설정을 따라가니 JUnit4 테스트가 잘 수행된 것이고... 다음 개발 버전에선 해결된 문제라고 나오는군요.

http://lampsvn.epfl.ch/trac/scala/ticket/1400

그런데, 이거 만드는 사람들이 Eclipse에 JUnit으로 테스트를 돌려봐야겠다는 생각을 안 했을리가 없는데...-_-; JUnit 쓰게 해달라는 소리는 예전부터 있었는데 말이죠...
...

그리고 각 항목별로 참고한 사이트
1)
Scala IDE for Eclipse: http://www.scala-lang.org/node/94

2)
Maven 프로젝트 만드는 건 직접 가르침을 받았습니다 :)

2) 3) 4) 5) 6) 7)
Java 프로젝트부터 시작하여 Scala 특성 추가하기 : http://lampsvn.epfl.ch/trac/scala/wiki/ ··· psemaven

8)
Using the Scala IDE for Eclipse with JUnit : http://www.scala-lang.org/node/363

...

그리고 삽질하면서 찾아본 사이트

maven-eclipse-plugin / 8번을 일일이 하지 않아도 될까 해서. http://maven.apache.org/plugins/maven-e ··· ojo.html

specs / 8번 때문에 가장 먼저 찾아봤는데... 잘 안 됩니다. 뭔가 버전업된 라이브러리를 올리는 것에 신경을 덜 쓰는 듯. http://code.google.com/p/specs/wiki/run ··· _eclipse

maven-eclipse-plugin Issue Tracker / specs에 있던 내용을 자동으로 해 볼려다. Eclipse 프로젝트의 Symbolic Link는 자동으로 만들어 줄 수 있긴 하지만, 아직 개발 중인 스냅샷 버전에만 있는 기능이긴 한데, 이걸 라이브러리 참조로 지정을 못 하니 있으나 마나. 아무튼 나중에 기능이 추가된다면 8을 자동으로 할 수도 있을 듯.
http://jira.codehaus.org/browse/MECLIPSE-178
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by pequt

2009/08/29 14:34 2009/08/29 14:34
, , , ,
Response
A trackback , 20 Comments
RSS :
http://eyefocus.byus.net/tt/rss/response/375

한 마디
아마 이 지구에서 우리의 역할은 신을 섬기는 것이 아니라 - 신을 만드는 것이다.
아더 C. 클라크