본문 바로가기
IDE & Tool/InteliJ

Intelij 멀티 모듈 소스 인식 불가 오류 - exception is java.lang.noclassdeffounderror

by 성은2 2024. 11. 5.

* 모든 모듈 설정을 완벽히 했는데 안된다고 생각될 때 백업 후 최후의 방법으로 써주세요!

 

 

컴파일 오류는 안나는데 서브 모듈(혹은 공통 모듈)의 소스를  실행하는 부분에서

런타임 오류로  java.lang.noclassdeffounderror 가 발생했다.

멀티 모듈 구성 후 잘 실행되던 프로젝트 였는데 pom.xml을 수정하고 Invalidate caches를 하는 중 설정이 꼬인 듯 했다.

설정 꼬이는거 하루 이틀 아니지만 유독 안잡혀서 꼬박 3일은 고생한듯..

 

 

[체크 리스트] 

* 의존성 추가 설정 확인

  • 프로젝트에 새 모듈을 추가한 경우 File > Project Structure > Modules 메뉴에서 모듈이 목록에 있는지 확인. 목록에 없으면 수동으로 모듈을 추가할 수 있습니다.
  • 만약 의존성이 없거나 잘못 설정된 경우,   main 모듈의 Dependencies에서 + 버튼을 눌러 sub 모듈을 추가. 

-> 이미 함

 

 

* 소스 경로 확인: 패키지나 클래스 경로가 올바른가? 

-> git에서 받은 플젝이기에 소스 경로 이상없음

 

* File > Invalidate Caches / Restart를 실행하여 캐시를 초기화한 후,  Build > Rebuild Project

-> 500번은 했음!!!

 

아무튼 원래 알고 있던 모든 방법을 동원해도 해결되지 않아서 실행한 방법은

새 경로에 New 프로젝트 생성이다.

물론 이것도 몇십 번 반복했지만 문제는 동일했었다..

이유는  Get from version Control로 Git 에서 소스를 새로 받아와 계속 새로운 폴더에 생성해 빌드를 시도 했기 때문이다.

(Git 에 .iml 파일이 커밋 되어있는 상태여서 새로 Clone을 받아도 동일한 iml을 사용 하고 있었다. 또한 .idea 설정 파일이 로컬에 있던걸 사용했기 때문일 수 있음)

 

 

 

[🔍해결]

- 🔥로컬 소스 내  .iml 파일 삭제 후 프로젝트 재구성함. 

- 🔥서브(공통)모듈 소스가 실제로 컴파일 되고 있는지 확인 => 컴파일 되어야 한다! 안되고 있다면 다음 Output path 확인.

- 🔥서브(공통)모듈 소스의 Compiler Output 확인 => Ctrl + Alt + Shift + S > Modules > 서브모듈 [Paths] 탭.

ComPiler Output > Output Path 설정 확인(메인모듈 과 통일)

 

[🔍분석]

1. 프로젝트 마다 .iml 파일이 다르게 설정될 수 있으며, 이로 인해 모듈 간의 설정 불일치가 발생할 가능성

*.iml : Intellij IDEA Module의 약자로,  IntelliJ IDEA에서 모듈별 설정을 저장하는 파일이다. 이 파일에는 모듈의 SDK, 라이브러리 경로, 디펜던시 정보 등이 포함되어 있어 git에 올리지 않는게 좋다.(팀과 공유X)

 

그래서 재설정 하고자  iml 삭제 후 프로젝트 모듈 종속성 및 라이브러리 설정을 다시했다.

 

2. 기존에 설정이 꼬여서 인지 out path에 이상한 경로가 적혀 있었다. 메인모듈의 Output Path 와 동일하게 설정.

런타임 오류가 발생할 땐 컴파일된 .class 파일이 생기는 target 폴더에 서브모듈 소스가 없었는데(즉 컴파일 대상으로 안 잡혀 있었음) 해결 후 target 경로에 sub소스가 생성된 걸 확인할 수 있었다.  => 여기선 common 소스가 서브(공통)모듈 이었음.

정말 반가웠음.

 

[상세 설명]

2-1. File > Project Structure (Ctrl + Shift + Alt + S) > Project > Compiler output 경로 설정

  ex) C:\gitRepo\gw\pointApp\target\classes 

2-2. File > Project Structure (Ctrl + Shift + Alt + S) > Modules> Path > Compiler output 확인

ex ) 메인 모듈 설정: Use module compile output path 체크 -> Output path 입력

ex ) 서브 모듈 설정: Use module compile output path 체크 > Output path 입력 (나는 메인과 동일하게 했음)