Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

JRebel에서 핫스왑할 대상 폴더 지정하기

사람마다 호불호가 좀 갈리기는 하지만 나는 익숙해져서 이젠 JRebel없이는 자바로 웹개발하기 힘든정도가 되었다. 한창 잘 쓰고 있었는데 언젠가부터(5.0 업데이트정도 쯤이 아닌가 한데 버전을 일일이 확인하지 않아서.) 톰캣을 띄울때 갑자기 JUnit관련 클래스를 찾을 수가 없다는 오류가 나오기 시작했다. 오류만 엄청 나오고 JUnit을 사용하는 코드는 톰캣에서 실행하는 코드와는 상관없으므로 톰캣을 정상적으로 잘 동작했기 때문에 귀차니즘에 처리를 안하고 미뤄두고 있었다. 하지만 빠르게 출력되는 로그에서 Exception 로그가 찍힐 때마다 본능적인 움찔거림이 발생하는 것은 어쩔수 없기에 신경이 많이 쓰여서 몇일전에 해결을 했다.

10:39:38.121 [Thread-7hread] WARN   org.springframework.core.type.classreading.AnnotationAttributesReadingVisitor - Failed to classload type while reading annotation metadata. This is a non-fatal error, but certain annotation metadata may be unavailable.
java.lang.ClassNotFoundException: org.junit.Before
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
  at org.springframework.core.type.classreading.RecursiveAnnotationAttributesVisitor.visitEnd(AnnotationAttributesReadingVisitor.java:167)
...

위와 같은 오류메시지가 출력된다. 이유는 정확히 모르겠지만 테스트 코드쪽의 JUnit 어노테이션들의 클래스를 로딩못해서 발생하는 오류로 보였다. 그래서 검색하다가 핫스왑에 사용할 대상폴더를 rebel.xml에서 설정할 수 있다는 것을 알게 되었다.

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">

  <classpath>
    <dir name="/home/outsider/projects/example/target/classes">
    </dir>
    <dir name="/home/outsider/projects/example/target/test-classes">
    </dir>
  </classpath>

  <web>
    <link target="/">
      <dir name="/home/outsider/projects/example/target/m2e-wtp/web-resources">
      </dir>
    </link>
    <link target="/">
      <dir name="/home/outsider/projects/example/src/main/webapp">
      </dir>
    </link>
  </web>

</application>

JRebel을 써본 사람은 알겠지만 rebel.xml은 메뉴를 통해서 프로젝트에 생성하기 때문에 사실 한번도 저 파일을 열어본적이 없다. JRebel을 버전업한 것 외에는 초기부터 rebel.xml을 건드린 적은 없는것 같은데(프로젝트를 재생성하면서 새로 추가했는지도...) 갑자기 왜 테스트 클래스쪽에서 오류가 발생하는지는 모르겠지만 <dir name="/home/outsider/projects/example/target/test-classes"> 부분을 제거하면 더이상 기존의 오류가 발생하지 않는다. 원하는 클래스가 핫스왑이 되지 않거나 불필요한 오류가 나오면 rebel.xml을 수정하면 되겠다.
2012/09/07 01:25 2012/09/07 01:25