2008년 10월 16일
이클립스와 패키지 파일 간의 파일 로드 시 경로문제 해결하기

이번에 자바 프로젝트를 진행하면서 프로젝트를 jar로 패키징 하였습니다. 기분 좋게 패키징을 완료하고 jar를 실행 시켰는데 프로젝트의 메타파일을 읽어 들이는 부분에서 FileNotFoundException 예외가 발생하였습니다. 문제의 원인은 이클립스에서 실행하기 위해 메타 파일의 상대경로를 이클립스 실행 기준에 맞추어서 지정해 놓았기 때문이었습니다. 다음은 제가 이번에 프로젝트를 진행하면서 겪었던 문제를 간단한 예제 코드로 작성해 보았습니다.


보시는 봐와 같이 보통 자바 입문서에 나오는 파일을 읽어오는 소스입니다. test.txt를 메타파일이라고 가정하겠습니다.


 


아래는 위 소스를 이클립스에서 실행 시키기 위한 test.txt의 경로 입니다.


 


위 소스를 이클립스에서 실행 시키면 test.txt파일의 내용아 아 ~ 주 ~ 잘 읽어 들입니다. 하지만 jar로 패키징 한 후 실행 시켜 보면 ... FileNotFoundException을 발생시키지요 ;;  아 ~ 이거 어떻게 해야하지 ... 결국 부장님께 여쭤보니 ClassLoader 클래스의 getResourceAsStream 메소드를 알려주셨습니다. ClassLoader 클래스는 자바의 클래스 로더를 개발자가 사용할 수 있도록 만들어 놓은 클래스인데요 ... 음 .. 그게 저도 아직 클래스 로더에 대한 공부가 만족스럽지 못해 자세한 설명은 못 드리겠네요 ... 에헴 ... 다음에 공부를 더 해서 포스팅 해 놓도록 하겠습니다. 어쨌든 ClassLoader 클래스의 getResourceAsStream 메소드를 이용하면 현재 클래스가 로드 된 위치의 파일의 InputStream을 리턴해 줍니다. 그럼 이 녀석을 이용해서 파일을 읽을 수 있겠죠 ~ 그리고 test.txt파일의 위치를 자바 소스가 있는 경로로 옮겨 주시면 jar로 패키지한 파일을 실행 시킬 때도, 이클립스에서 실행 시킬 때도 test.txt 파일의 경로를 바꿔주지 않고도 동일한 방법으로 test.txt파일을 읽어들일 수 있습니다. 물론 jar로 패키지 할 때 test.txt 파일로 함께 묶어 주어야 하겠죠? 참고로 test.txt파일을 자바 소스있는 위치로 옮겨주는 이유는 이클립스 3.4 버전에서 (그 이하 버전은 사용해 본 적이 없어서 잘 모르겠네요 ;;) src폴더에 있는 파일들은 빌드가 되면 bin폴더로 옮겨지는데 bin폴더가 바로 자바 파일이 빌드 된 클래스 파일들이 모이는 곳이고 이 클래스 파일들이 모이는 곳에 test.txt파일을 옮겨주어야 ClassLoader에서 getResourceAsStream 메소드를 호출해 주었을 때 text.txt파일을 읽어들여 InputStream 객체를 리턴할 수 있기 때문입니다.


 위 설명데로 ClassLoader클래스의 getResourceAsStream 메소드를 이용하기 위해서 test.txt파일을 src 디렉토리로 이동시켜주었습니다.


 


패키징 된 jar 파일에 text.txt 파일의 위치입니다. 이렇게 jar파일을 묶을 수 있도록 build.xml을 코딩해 주어야 하겠죠? 아참, 저는 jar를 묶을 때 ant를 이용합니다.


 


 아래는 위 문제를 해결한 예제 소스입니다. ^^


 


by greenfrog | 2008/10/16 22:45 | JAVA | 트랙백 | 덧글(0)
트랙백 주소 : http://greenfrog7.egloos.com/tb/964758
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>