일간에러) 3 Spring WebApplicationInitializers detected on classpath

작성: 2022.04.15

수정: 2022.04.15

읽는시간: 00 분

Development/Daily Error

반응형

Intro

톰캣 8.5 버전으로 프로젝트를 실행하는데 어플리케이션이 기대한 대로 동작 하지 않았다. 로컬에서는 아무 문제 없이 잘 작동했는데 도커로 톰캣 컨테이너를 띄워 실행키기면 계속 문제가 발생했다.

심지어 에러 로그도 쉽게 찾을 수가 없었다.

tomcat/logs 경로에서 catalina.2022-04- 으로 시작하는 로그에서는 마치 정상적으로 실행 된 것 처럼 보였는데 localhost.2022-04- 로 시작되는 로그 파일을 확인 하자 그제서야 아래와 같은 에러 메시지를 보여줬다.

13-Apr-2022 13:10:54.092 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 3 Spring WebApplicationInitializers detected on classpath
13-Apr-2022 13:10:55.743 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
13-Apr-2022 13:10:57.237 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [springSessionRepositoryFilter]
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionRepositoryFilter' available
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:872)
...

3 Spring WebApplicationInitializers detected on classpath 가 비극의 서막이었고, 그 후로 springSessionRepositoryFilter 라는 이름으로 등록된 스프링 Bean을 찾지 못해 에러가 발생했다.

원인

Stackoverflow 에서 비슷한 상황을 겪었던 유저들이 옹기종기 모여 있는 글을 찾아 거기에서 힌트를 얻었다.

https://stackoverflow.com/questions/42826879/2-spring-webapplicationinitializers-detected-on-classpath

해당 글의 질문자는 웹어플리케이션 이니셜라이져가 2개가 떴다고 하고, 댓글을 작성한 다른 많은 사용자들도 2개 혹은 나처럼 3개가 뜬 사람들도 있었다.

원인을 정리하자면, 포함하고 있는 라이브러리 중에서 또 다른 WebApplicationInitializer 를 가지고 있다 보니 톰캣을 실행 할 때에 그중에 의도하지 않은 이니셜라이저로 어플리케이션을 실행하려고 했기 때문이다.

해결

image-20220413143018394

본격적인 범인 찾기 시작. 모든 사용중인 라이브러리들에서 구현한 WebApplicationInitializer 목록을 쭉 뽑아 보고 하나씩 체크 해 보았다.

맨 위에 있던 JerseyAutoConfiguration.java 파일을 먼저 체크해보니 spring-boot-autoconfigure 라이브러리에 포함 되어 있는 파일 이다.

두번째 ServletContextInitializer와 세번째에 위치한 SpringBootServletInitializer는 스프링 부트 라이브러리에서 왔다.

그리고 그 아래 있는건 클래스명에서 알 수 있듯 각각 Spring Security 및 Spring Session 에서 왔다.

바로 pom.xml 파일을 열고, 하단에 선택된 Text 탭 말고 그 우측에 있는 Dependency Analyzer를 클릭

image-20220413143607875

Dependency Analyzer

바로 강력한 용의자가 눈에 띈다. 지금 이 프로젝트는 다른 프로젝트와 세션 공유를 하지 않는다.

<exclusion>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
</exclusion>

해당 라이브러리를 제외 하고 다시 빌드 한 뒤에 실행 시켜 보았다.

image-20220413144050003

2 Spring WebApplicationInitializers detected on classpath

WebApplicationInitializers가 한개 줄어들었다. 말썽을 부리던 범인이 맞을까?

새로운 war파일로 어플리케이션을 실행해 확인해보니 문제가 해결 되어 정상적으로 잘 작동 된다.

마지막으로 Spring WebApplicationInitializers가 한개만 감지 되도록 해보려고 불필요한 의존성들을 모두 제거 해 보았지만 마피아는 하나도 없고 모두 선량한 시민들 뿐 이었다.

결론: 톰캣이 엉뚱한 WebApplicationInitializers 를 사용하다 에러가 발생하면, 찾아서 의존성을 제거해주자.

반응형