Spring

배포 서버 ClassNotFoundException 트러블 슈팅

쭈녁 2024. 5. 2. 21:59

진행 중인 프로젝트에 jenkins 파이프 라인으로 자동 배포를 세팅해 두었다.

배포 브랜치로 넘어가기 전 로컬에서 서버를 올려보고 머지를 넣었음에도 배포가 실패하였다.

 

처음엔 젠킨스 내부에서 빌드에 문제가 있었나 보았지만 문제가 없었고 배포 서버에서 로그를 확인해 보니

 

java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/json/JSONException

java.lang.ClassNotFoundException: org.springframework.boot.configurationprocessor.json.JSONExcept ion

 

jar 실행시점에 두 개의 로그가 남은 것을 확인할 수 있었다.

 

라이브러리를 못 받았나 싶어서 로컬에서 build.gradle을 수정하고 여러 방법으로 해결하려 했지만 동일한 로그가 계속 남아 인터넷을 서칭 해보는 중 아래 블로그에서 해답을 찾았다!! 감사합니다

 

https://fourjae.tistory.com/7

 

[Spring boot] configurationprocessor JSONException 에러

로컬에서 잘 돌아가는데도 불구하고 서버에 올렸을 때 Source -> Build -> Deploy 과정이 전부 성공했음에도 불구하고 접속이 되지않아 로그를 열어 스텍 트레이스를 확인하였다. 확인 결과 java.lang.Ille

fourjae.tistory.com

 

No Class Def Found Error

JVM이 클래스 정의에 대한 내부 클래스 정의 데이터 구조를 찾아서 찾지 못했음을 나타낸다고 한다.

 -> 컴파일 환경에서는 클래스 참조가 되었지만 런타임(실행) 환경에서는 해당 클래스를 찾을 수 없는 경우에 발생한다고 한다.

ClassNotFoundException

클래스가 클래스 경로에서 발견되지 않음. 클래스 정의를 로드하려고 했지만 클래스가 클래스 경로에 존재하지 않음

 

ClassNotFoundException은 많이 보았지만 No Class Def Found Error는 매우 생소했다.

 

요약하자면 컴파일 시점에는 라이브러리의 경로를 통해 클래스 참조가 되었지만 런타임에 클래스를 찾지 못한 경우이다.

라이브러리를 변경하거나 발생하는 클래스를 다른 클래스로 변경하면 된다는 글을 보고 코드를 변경하였다.

 

실행 환경과 특정 라이브러리의 호환이 안 좋은 건가...

 

라이브러리가 가지고 있는 클래스 정보이다. 아마 springframework.boot.configurationprocessor경로는 AutoConfig와 같은 설정값을 가지고 있는 클래스인 것 같은데 해당 경로로 찾아오지 못하는 것이 아닐까 추측된다.

 

 

조금 별로라고 생각되긴 하지만 응급처치로 의존이 가능한 클래스의 예외로 바꾸어 던져주었다.

try {
    jsonObject = (JSONObject) jsonParser.parse(result);
} catch (Exception e) {
    throw new JSONException("파싱 실패");
}

 

그리고 기존에 의존하던 org/springframework/boot/configurationprocessor/json 경로의 예외가 아닌 org.json 경로의 예외로 바꾸어 던졌다.

//import org.springframework.boot.configurationprocessor.json.JSONException; <- 삭제

import org.json.JSONException;

 

해당 방법을 적용하고 배포하니 문제없이 실행이 됨을 확인할 수 있었다. (뻘짓한 2시간 아꿉다...)