반응형
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 의 버그(?) 때문에 발생하는 것으로 보인다.
해결책은..
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 해주자!
도움이 되셨다면 손가락 꾸욱~
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Android 4.1 Jelly Bean ( 젤리 빈 ) 무엇이 바뀌었을까? (0) | 2012.07.03 |
---|---|
[Java] 병렬 프로그래밍 - 객체 공유. (0) | 2012.06.29 |
[Eclipse&Android] Failed to rename directory ...\android-sdks\platform-tools to ...\android-sdks\temp\PlatformToolPackage.old01. 해결법. (2) | 2012.06.25 |
[Eclipse&Android] Eclipse 에서 Android project 를 library 로 연결할 때 주의사항. (2) | 2012.06.25 |
[Java] 병렬 프로그래밍 - 스레드 안전성 (2) | 2012.06.19 |
댓글