티스토리 뷰

Java

CLASSPATH 설정하기-1

꿈이 있는 자유 2009. 1. 11. 23:30

우리가 자바를 시중 서적들을 통해서 배울 때 책들끼리 서로 잘못 기술하고 있는 부분들이 때로는 우리를 혼동케 한다. 그 중 대표적인 사례중의 하나가 CLASSPATH 가 아닐까? 어떤책에서는 별도로 설정할 필요가 없다고 하기도 하고, 또 어떤 책에서는 설정해야 한다고 기술하고 있다. 언제 설명하냐면 꼭 첫장 자바의 환경설정에서 기술한다. 그래서 가끔 강의중에 질문을 받기도 한다.
결론부터 말하자면 설정할 필요가 있을 때도 있고, 그렇지 않을 때도 있다. 다만, 내가 여기서 설명하려고 하는 것은 단순히 자바의 환경설정시 설정해야 하냐, 하지 말아야 하냐의 2분법적 문제가 아니다.
일단, 시작은 내 컴퓨터의 환경설정에서 별도로 CLASSPATH 를 설정하지 않았다. 홍릉과학출판사에서 2004년 8월 출간한, 개인적으로 많이 참조하는 교재인, [J2SE 5.0 프로그래머를 위한 JAVA2](http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200409180021) 책 5페이지를 보면 CLASSPATH 에 대해 아래와 같이 설명하고 있다.

CLASSPATH : 자바 라이브러리 클래스들이 저장된 디렉터리를 설정한다. 현재 J2SDK는 필요한 클래스 라이브러리를 <J2SDK>\jre\lib\ext 디렉터리에 복사하면 사용할 수 있기 때문에 특별한 경우가 아니면 CLASSPATH는 설정하지 않는 것이 좋다.


필자 역시 보통 설정하지 않는다. 하지만, 설정해 놓으면 아주 편리한 경우가 많다. 어떤경우에? 이제 강의를 시작합니다.

먼저 아래의 소스를 코딩했다.

이 소스는 main () 을 갖고 있는 클래스와 동일 디렉토리에 놓지 않고 다른 디렉토리에 컴파일하겠다. 필자는 main() 클래스를 C:\JavaRoom 에 놓고, 위의 코드는 아래의 그림처럼 C:\temp 디렉토리에 컴파일 했다. 이때 사용하는 컴파일 옵션이 -d 이다. -d 옵션 뒤에는 컴파일된 클래스 파일이 들어갈 디렉토리 경로를 지정하면 된다.


그럼. 이번엔 main() 이 들어있는 클래스를 코딩해 보자.


코딩이 끝났으면, 컴파일해보자. 예상하자면, 당연히 컴파일에러가 나야 하지 않을까? 왜냐하면 Test 클래스는 현재 main() 을 갖고 있는 ClassPathDemo 클래스와 다른 디렉토리(C:\Temp)에 있기 때문이다. 그런데...

어라!!! 왜 컴파일에러가 나지 않을까? 또한,

아니 정상적으로 결과도 출력된다. 이게 어찌 된 일인가? 분명 Test 클래스는 C:\Temp 디렉토리에 컴파일했는데...
자!!! 그 이유는 여기에 있다. 아래 2개의 그림속의 Test.class 의 생성시간을 보기 바란다.
위의 그림에서는 아까 처음에 도스모드에서 컴파일했던 시간이 나타난다. 즉 javac.exe -d C:\Temp  Test.java 로 컴파일했던 그 시간에 정상적으로 C:\Temp 에 클래스 파일이 생긴것이다. 아래것도 보자.

우잉? 이건 뭔가? 왜 C:\JavaRoom 에도 Test.class가 있는가? 그리고 시간도 에디터에서 ClassPathDemo.java 를 컴파일했던 시간과 같지 않은가?  그 이유는 에디터에서 ClassPathDemo.java 를 컴파일할 때, 소스 코드속에 포함돼있던 Test 클래스의 소스인 Test.java 가 동일한 디렉토리 즉, C:\JavaRoom 에 있기 때문이다. 에디터가 같이 컴파일했던 거다. 그래서 동일 디렉토리에 클래스 파일이 같이 생성된것이고 같이 실행된 것이다. 그럼...실험목적과 틀리지 않은가? 그래서 다시 방법을 바꾸기로 했다.

이번엔 아예 Test.java 파일도 C:\JavaRoom 이 아닌, C:\Temp 디렉토리에 이동시켰다.
자 정리하자면, 레퍼런스할 main() 이 있는 ClassPathDemo.java 는 C:\JavaRoom 에 있고,
레퍼런싱을 당할 Test.java 는 C:\Temp 에 있다.

아래의 그림처럼 이제는 직접 C:\Temp 폴더에 새로 컴파일했다. 물론 Test.class는 C:\JavaRoom 이 아닌, C:\Temp 폴더에 생성된다.

역시 예상대로 ClassPathDemo.java 를 컴파일했더니 컴파일 에러가 발생했다. 이게 정상이다. 당근 Test 클래스를 찾을 수 없다고 나와야 하지 않는가?

이제 문제를 해결해야겠다. 사실 시중에 있는 자바 입문서들중 필자가 본 교재에서는 항상 예제파일들이 동일 디렉토리에 있으니까 별 문제가 없겠지만, 실무에서는 당연히 목적에 의해 클래스들이 각 디렉토리에 나눠져 있지 않은가? 다른 디렉토리에 있는 클래스를 레퍼런싱하기 위해 아래와 같이 -classpath 옵션이 컴파일시 필요하다. 즉, 컴파일시 필요한 클래스가 위치해 있는 디렉토리를 -classpath 뒤에 기술하면 된다.

정상적으로 컴파일됐지만, 실행시에 문제가 발생했다. 왜냐하면 Test 클래스를 런타임때 찾지 못했기 때문이다. 그래서 NoClassDefFoundError 가 발생했다. 

그럼, 아래 그림처럼 -classpath 를 지정해 주면 되는가?  그런데 이번엔 ClassPathDemo 클래스를 찾지 못한다는 메시지가 나타난다. main() 이 있는 클래스를 지정해 주지 않았기 때문이다.

결론, 아래의 그림처럼 현재 디렉토리에 있는 ClassPathDemo.class 도 지정해 줘야 하고 불러와야 할 Test.class 가 있는 C:\Temp 도 지정해야 한다. 그래서 -classpath 를 지정할 때는 반드시 현재 디렉토리를 함께 기술해야 한다. 또 하나 주의할 점은 Windows 플랫폼에서는 classpath 의 구분자를 ';' 로 해야 하고 Linux/Unix 에서는 ':' 로 지정해야 한다는 것이다. 그럼...정상적으로 실행 완료...
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함