라이브러리 최신화 진행 중 의존성에 이미 추가되어 있음에도 특정 메서드가 없다는 에러가 발생했습니다. 온라인 repository에 접근 할 수 없는 프로젝트 특성상 하나하나 system scope로 lib폴더에 jar파일을 추가하고 이를 경로를 통해 의존성을 추가해주는 방식을 사용하고 있었습니다 Clean과 여러 관련 다른 의존성도 넣어보았지만 해결이 되지 않았습니다. 두 시간의 씨름 끝에 구 버전의 jar 파일은 lib폴더에서 삭제하고 다시 빌드하니 오류가 사라졌습니다.
추가적인 조사를 하였습니다. 톰캣 플러그인 내부에 temp폴더 하위에 pusblish 된 프로젝트를 살펴보니 실제로 jar파일이 없거나 여러 버전이 함께 저장되어있는 것을 발견하게 되었고, 근본적인 원인을 찾기 위해 조사하였습니다.
근본적인 원인은 lib폴더와 SystemScope방식의 대한 이해 부족 때문이었습니다.
lib 폴더는 WEB-INF 밑에 위치하는 폴더로 본래는 빌드가 될 때 의존성 jar 파일들을 lib폴더에 묶어 배포하게 되는 형태입니다. 그리고 tomcat은 WEB-INF 폴더 하위에 위치한 lib폴더 내부에 있는 모든! jar파일을 스캔하여 읽게 됩니다.
배포 과정에서 webapp 폴더가 복사되는 과정이 있었고, 이로인해 프로젝트 내부에 WEB-INF/lib 폴더도 함께 복사 되어진 것 입니다. 그러니 Maven 의존성을 추가하지 않은 jar파일들도 함께 들어가게 된 것입니다.
그러면 왜 뜬금없이 프로젝트에서 lib폴더를 WEB-INF 폴더 하위에 위치하게 된 걸까요?
이유는 SystemScope 방식의 의존성 처리에 있었습니다. SystemScope 방식은 다른 maven 스코브와 달리 해당 jar를 참고만 하지 빌드 할 때 lib폴더에 저장 시키지는 않습니다. 이로인해 maven reopsitory 하위에는 등록된 것으로 보이지만 실제로 실행하면 jar파일이 없어 컴파일 오류가 발생하게 된 것입니다.
이에 대한 해결책은 명쾌했습니다. system scope를 사용하지 않고, lib폴더의 변경하면 됩니다.
SystemScope 대신 프로젝트에 내장 repository를 생성하여 lib폴더 내부에 있던 jar파일들을 repsository 추가한 후 해당 repository를 maven에서 참조하도록 하면 됩니다. 이때 repository 내부는 maven의 폴더 구조 형식을 따라줘야 합니다.
톰캣과 메이븐에 대해서 더 깊이 이해하는 경험이었습니다.