[SpringBoot] 스프링부트 실행 시 톰캣 에러 (내/외부 톰캣 사용 문제)
# 오류
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 버전이 적용되도록 한다.
※ 참고