Dynamic Code Evolution VM (DCEVM)
우연하게 Hotswap 기능을 제공해 주는 DCEVM 오픈 소스를 알게 되었다.
그것도 공짜이면서 설정이 복잡하지도 않고, 간단하며 hotswap이 빠르게 적용된다.
방금 적용 한 후 테스트를 해보니 hotswap이 정상적으로 동작하는 것을 확인했다.
저장할 때 마다 hotswap을 진행하는데 reload 속도도 빠르고, 최초 애플리케이션 구동 시 오래 걸리지도 않는다.
설치 방법은 다음과 같다.
1.
DCEVM 다운로드
https://github.com/dcevm/dcevm/releases 페이지 이동 후 최신 버전을 다운로드 받는다.
2.
다운로드 받은 installer-light-jdk7u51.10.jar 파일을 더블 클릭하면 다음과 같은 화면이 나오고 로컬 PC에 설치되어 있는 java7, 8을 선택하여 "install DCEVM as altjvm" 버튼을 클릭한다.
정상적으로 설치가 되면 Installed altjvm? 라인에 Yes 가 표시된다.
현재 프로젝트는 java7 기반으로 하기 때문에 아래 두 군데만 설치했다.
java7, 8만 지원이 가능하다고 하니 엄한 java6에 설치하지 말기 바람
3.
Agent 다운로드
https://github.com/HotswapProjects/HotswapAgent/releases 페이지 이동 후 최신 버전을 다운로드 받는다.
다운로드 받은 hotswap-agent.jar 파일을 특정 디렉토리에 옮겨 놓는다. (어디든 상관 없음)
4.
Tomcat plugin의 Open launch configuration 을 클릭한 후 다음과 같이 옵션을 추가한다.
-XXaltjvm=dcevm -javaagent:C:\jdk1.7.0_25\hotswap-agent.jar
5.
Automatically publish when resources change 라디오 버튼 클릭 (디폴트 옵션으로 체크되어 있음)
tomcat plugin의 Modules 탭으로 이동하여 Auto reloading enabled 체크 박스 해제
6.
Tomcat을 Debug 모드로 띄우면 다음과 같은 로그가 찍힌다.
HOTSWAP AGENT: 19:35:49.714 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {0.1-beta4} - unlimited runtime class redefinition.
Dynamic Code Evolution 64-Bit Server VM warning: JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable.
HOTSWAP AGENT: 19:35:49.918 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins: [Hotswapper, AnonymousClassPatch, WatchResources, Hibernate, Spring, Jersey2, Jetty, Tomcat, ZK, Logback, JSF, Seam, ELResolver]
위와 같이 로그가 찍히면 정상적으로 동작이 되는 것이다.
Hotswap 지원 기능 정리
- 메소드 바디 체인지 시 변경된 내용 즉시 반영
- 추가되는 메소드 사용 가능
- 다른 클래스에 추가되는 메소드 사용 가능
- 메소드 이름 변경 가능
- 멤버 필드 추가 가능
- 멤버 필드 이름 변경 가능
- 상속 가능
- 슈퍼 클래스 메소드의 바디 변경 가능
- 슈퍼 클래스 새로운 메소드 추가 가능
- 슈퍼 클래스 기존 메소드 이름 변경 가능
- 슈퍼 클래스 기존 메소드 삭제 가능
- super class 자체가 변경되는 것은 hotswap 불가능. 즉, Parent1 슈퍼 클래스를 상속받고 있는 상태에서 Parent2로의 변경 시 hotswap이 제공되지 않는 다는 것이다.
- 인터페이스
- 구현되어 있는 인터페이스 추상 메소드 지원
- 구현되어 있는 인터페이스 추상 메소드 삭제 가능
- 구현되어 있는 인터페이스 삭제 불가
- 인터페이스 상속으로 인한 hotswap 지원 불가
- 인터페이스 상속 해제로 인한 hotswap 지원 불가