spring-boot-devtools + gradle을 Eclipse로 이동하면 ClassCastException

문제


  • Spring boot devtools + gradle을 Eclipse에서 "Spring Boot 응용 프로그램"으로 실행하면 ClassCastException가 발생합니다.
  • gradle에서 "bootRun"으로 실행하면 부팅은 성공하지만 코드 변경 사항은 반영되지 않습니다.

    해결책


  • gradle의 "bootRun"으로 부팅하기
  • 프로젝트의 "자동으로 빌드"에 체크
  • Java 빌드 경로를 gradle 빌드 대상에 맞추기

  • 해설



    참고)
    [Java] Spring Boot에서 Hello World! (입문편) | 해양로드

    1. 스타터 프로젝트 만들기



    먼저 SpringBoot의 스타터 프로젝트를 만듭니다.




  • 형식: Gradle(Buildship 2.x)
  • 포장: war
  • Java 버전: 8
  • 언어: Java

  • 나중에 기본값으로


  • Spring Boot Version: 1.5.10
  • DevTools
  • Thymeleaf
  • Web

  • 종속성으로 위에서만 선택합니다.


  • 기본 URL: http://start.spring.io/starter.zip
  • 전체 URL: http://start.spring.io/starter.zip?name=demo03&groupId=com.example&artifactId=demo03&version=0.0.1-SNAPSHOT&description=Demo+project+for+Spring+Boot&packageName=com.example.demo&type=gradle-project&packaging=war&javaVersion=1.8&language=java&bootVersion=1.5.10.RELEASE&dependencies=devtools&dependencies=thymeleaf&dependencies=web

  • 2. HelloController.java의 작성



    스타터 프로젝트가 완료되면 HelloController를 추가합니다.

    HelloController.java
    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String hello() {
            return "Hello World !!";
        }
    
    }
    

    3. Spring Boot 애플리케이션으로 실행



    프로젝트를 마우스 오른쪽 버튼으로 클릭하고 나오는 Spring Boot 응용 프로그램을 실행합니다.




    Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader
        at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getUrls(DefaultRestartInitializer.java:93)
        at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getInitialUrls(DefaultRestartInitializer.java:56)
        at org.springframework.boot.devtools.restart.Restarter.<init>(Restarter.java:140)
    (略)
    

    쵸 (삐뽀)
    …라는 것이 이번 발단입니다. Java9에서.
    그래서, 다음에 시도한 것이, 원래 gradle 프로젝트이니까, gradle에서 기동하면 되지 않을까요? 라고 일.

    4. gradle의 "bootRun"에서 실행









    (*^-゚)vィェィ♪
    잘 작동했습니다! …라고 생각한 것도 잠시.
    소스 코드를 수정해도 즉시 반영되지 않습니다 ...... orz
    물론 gradle 태스크를 멈추고, 다시 실행하면 반영됩니다만, 모처럼 ClassCastException 를 사용하고 있기 때문에, 즉시 반영시키고 싶다!
    그리고 시행착오하는 일이 자주…

    5. 프로젝트의 빌드 경로 변경



    시행착오의 결과, 소스 코드를 보존했을 때의 자동 빌드 패스가, gradle의 빌드 패스와 맞지 않는 것을 깨달았습니다.
    Eclipse의 빌드 경로 설정을 변경하지 않으면 DevTools 디렉토리 아래에 빌드 결과가 저장되는 것 같습니다.
    이것을 gradle 의 빌드에 맞추어 바꾸어 보면…


    bin  …   출력 폴더: src/main/javabuild/classes/main  …   출력 폴더: src/main/resourcesbuild/resources  …   출력 폴더: src/test/java




    ☆(^o^)乂(^-^)☆ 히타타!!
    소스 코드를 저장하면 즉시 반영됩니다!
    ※resources아래는 확인하고 있지 않으므로, 패스가 잘못되어 있으면 죄송합니다.

    좋은 웹페이지 즐겨찾기