생계유지형 개발자/Stack Over Flow 한국판

[SpringBoot] 스프링부트 실행 시 톰캣 에러 (내/외부 톰캣 사용 문제)

이 가을 2021. 2. 19. 11:50

# 오류

2021-02-19 10:48:50.749 ERROR 26881 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :

***************************
APPLICATION FAILED TO START
***************************
Description: An attempt was made to call a method that does not exist.

The attempt was made from the following location:
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:184)

The following method did not exist:
    org.apache.tomcat.util.modeler.Registry.disableRegistry()V

The method's class, org.apache.tomcat.util.modeler.Registry, is available from the following locations:
    jar:file:/Users/user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.5/tomcat-embed-core-8.5.5.jar!/org/apache/tomcat/util/modeler/Registry.class

The class hierarchy was loaded from the following locations:
    org.apache.tomcat.util.modeler.Registry: file:/Users/user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.5/tomcat-embed-core-8.5.5.jar

Action:
    Correct the classpath of your application so that it contains a single, compatible version of org.apache.tomcat.util.modeler.Registry Process finished with exit code 0

 

Spring boot 2.4.2 버전을 사용했다.

 

# 원인

부트 프로젝트를 생성하고 아무 설정을 하지 않으면 기본적으로 내장된 톰캣 웹서버를 사용해 앱을 실행하게 되어 있다.

에러 문구를 한 줄씩 다시 한번 보면,

 

The following method did not exist:
    org.apache.tomcat.util.modeler.Registry.disableRegistry()V 
=> disableRegistry() 라는 메소드를 호출하지만 메소드가 없다.


The method's class, org.apache.tomcat.util.modeler.Registry, is available from the following locations: 
    jar:file:/Users/user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.5/tomcat-embed-core-8.5.5.jar!/org/apache/tomcat/util/modeler/Registry.class 
=> 메소드가 있는 클래스는 Registry.class이며, 클래스의 위치이다.


The class hierarchy was loaded from the following locations: 
    org.apache.tomcat.util.modeler.Registry: file:/Users/user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.5/tomcat-embed-core-8.5.5.jar

=> 클래스가 로드되는 라이브러리의 위치이다.

Action: 
    Correct the classpath of your application so that it contains a single, compatible version of org.apache.tomcat.util.modeler.Registry Process finished with exit code 0 

=> 클래스패스를 올바르게 명시하고, Registory 클래스의 적합한 버전을 써라.

 

즉, 현재 .m2에 설치된 내장 톰캣 라이브러리 버전이 8.5.5이고, 여기엔 org.apache.tomcat.util.modeler.Registry.disableRegistry() 라는 함수가 없다는거다.

스프링부트 2.4 버전을 사용하고 있다면 embeded tomcat 버전은 9 이상이어야 한다. 레파지토리 경로에 9.0.x 버전이 설치되었는지 확인해보고, 8.x 버전은 삭제한다.

# 해결

위에서 언급한 대로, 톰캣 버전은 9 이상을 사용해야 한다. 

확실한 방법은 8.5.5와 충돌되지 않게 라이브러리를 삭제하는 방법인데 만약 다른 프로젝트에서 8을 사용하기 때문에 삭제가 불가능하면 IDE에서 External Library에서 무슨 버전 적용되어있는지 확인해보고 9 버전이 적용되도록 한다.

 

 

※ 참고

okky.kr/article/844920

 

OKKY | 스프링 부트 실행하면 갑자기 이런 오류가 납니다..

어제는 안그랬는데 갑자기 오늘 실행하니까 이런 오류가 나네요 어떻게 해야하나요? Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. ERROR 09:35:46.263 [main Loggin

okky.kr

engkimbs.tistory.com/755

 

[Spring Boot #6] 스프링 부트 내장 웹 서버 톰캣(tomcat) 설정

| 스프링 부트 내장 웹 서버 설정 스프링 부트 프로젝트를 생성할 시 스프링 부트에서는 내장 서블릿 컨테이너인 톰캣(tomcat)이 자동적으로 설정됩니다. 스프링 부트에서는 ServletWebServerFactoryAutoCo

engkimbs.tistory.com