CannotLoadBeanClassException: Cannot find class 오류 발생 원인 및 해결 방법
로컬 환경에서 spring 프로젝트를 tomcat에 구동하는 과정에서 'org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class'과 같이 bean을 로드하지 못했다는 오류가 발생했습니다.
잠깐 전까지만 해도 잘 동작하고 있던 프로젝트였기 때문에 그 사이 무언가를 잘못 건드렸을 거라고 생각하고 원인을 찾아보았는데요.
* 'Project Clean...' 작업 및 'Server Clean...' 작업을 수행한 직후 발생하였습니다.
Cannot find class 오류의 대상 클래스는 'root-context.xml' 파일에서 bean으로 등록하고 있는 파일이었으며, 프로젝트 상으로는 xml 파일에 명시된 경로에 정상적으로 위치해 있었는데요.
환경 설정 등을 살펴보던 중 'Java Build Path -> Libraries' 쪽에서 문제의 원인을 찾을 수 있었습니다.
JRE System Library로 잡힌 jdk가 기존에 사용하던 버전이 아닌 다른 버전으로 잡혀 있었고, (unbound)라는 내용과 함께 위쪽 경고 부분을 보면 'Build path entry is missing'과 같이 결국 명시된 jdk를 찾지 못했기 때문에 발생한 문제였는데요.
문제 해결은 unbound 된 JRE System Library를 제거하고, 우측 Add Library를 통해 JRE System Library를 다시 추가하면서 그 과정에서 설치된(+ 사용할) jdk를 설정해 주면 되는데요.
(해당 내용을 수정한 다음 프로젝트 클린 후 실행 시 프로젝트가 정상적으로 실행되는 것을 확인할 수 있었습니다.)
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
...
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_111">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
...
</classpath>
(.classpath 파일)
문제는 해결되었지만 설정된 JRE System Library가 변경된 이유는 무엇인지도 궁금했는데요.
근본적인 원인은 프로젝트 경로에 있는 '.classpath' 파일의 변경이었습니다.
(해당 파일은 숨김 처리되어 있기 때문에 숨김 해제를 해야 볼 수 있습니다.)
작업 과정에서 SVN(형상관리 툴)을 통해 프로젝트 update를 진행했었는데, 그 과정에서 다른 쪽에서 잘못 올린 '.classpath' 파일이 업데이트되어 버렸고 project clean 과정에서 '.classpath' 파일이 갱신되어 프로젝트에 설정된 JRE System Library 버전이 변경되었던 것이었습니다.