본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Eclipse&Android] Library 사용시 발생하는 NoClassDefFoundError 에 대한 대처방법.

by 돼지왕 왕돼지 2012. 6. 26.
반응형




Eclipse 에서 library 를 build path 에 연결하여 사용하다 보면, 간혹가다 Compile 은 잘 되는데 Runtime 에 Error 을 발생시키는 경우를 마주친다. 이 에러는 바로 NoClassDefFoundError! 보통은 library 로 사용되는 project 가 또 다른 library 를 참조할 때 발생되곤 한다.

NoClassDefFoundError 는 ClassNotFoundException 과 같은 녀석이라고 혼동되는 경우가 있는데 이 둘의 차이는 다음과 같다.

NoClassDefFoundError 는 Virtual Machine 이 runtime 에 해당 class 를 찾을 수 없을 때 발생한다. 이 말은, compile time 에는 찾을 수 있다는 말이다. ClassNotFoundException 은 compile time 에는 해당 이름이 제공되지 않고, runtime 에만 제공되는 경우에 발생하는 exception 이다. ( 보통 reflection 을 사용하는 경우에 해당되겠다. )

 
이 NoClassDefFoundError 는 다시 말해, Compile time 에는 해당 class 가 연결이 되지만, Runtime 에는 연결이 안 된다는 것으로, Eclipse 에서는 연결이 되지만, Runtime 에는 해당 class 가 실제 JVM 에 안 올라온 경우를 말한다. 이는 엄밀히 이야기하자면, Eclipse 의 버그(?) 때문에 발생하는 것으로 보인다.
( 사실 버그라기엔 무리가 있지만.. 그래도 정~~말 똑똑한 IDE 라면.... )

해결책은..
Library 로 사용되는 project 에서 import 하는 또 다른 library 를 build path 에서 check 해주면 된다.

Project 우클릭  ->  [Preferences]  ->  [Java Build Path]  ->  [Order and Export] Tab  ->  import 하는 library check  ->  library porject Clean -> library 사용 프로젝트 Refresh & Clean.

 
위와 같이 하면, library 에서 사용하는 또 다른 library 가 export 가 되기 때문에, 최종적인 client 에서 문제 없이 사용할 수 있다. 즉 export 가 체크 되지 않은 상황에서도 eclipse 는 해당 library 를 사용할 수 있는 것처럼 간주되기 때문에 발생하는 버그이다. 하지만, library 가 사용하는 library 가 최종 client 에서 사용되지 않는다면.. eclipse 도 이를 판단하기는 쉽지 않을 것으로 보인다.

결론적으로, library 로 사용되는 project 에서 다른 library 를 사용한다면, 해당 library 들을 함께 export 해주자! 

 
도움이 되셨다면 손가락 꾸욱~




 




반응형

댓글