CLASSPATH

프로그래밍/Java 2009. 1. 6. 17:44 Posted by galad
http://www.ibm.com/developerworks/kr/library/j-classpath-windows/index.html

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src src\test\xml\XMLMain.java

jdk설치 디렉\jre\lib\ext에 넣어둔 라이브러리도 참조해버렸다...
dom4j관련 에러가 나야 정상일 듯 싶은데...

역시나 jdk설치 디렉\jre\lib\ext에 넣었던 dom4j 관련 라이브러리 삭제 후 실행했더니 에러 발생.
그래서 다음과 같이 해봤더니,

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src -classpath E:\workspace\java_run_test\Lib src\test\xml\XMLMain.java

E:\workspace\java_run_test\Lib 여기에 dom4j관련 라이브러리가 있는데도 에러가 난다.
왜 그런가 봤더니
"완전하고, 개별적으로 컴파일 된 서드 파티 라이브러리를 사용하지 않는 경우를 가정했다. 만약 그렇다면, 이들을 classpath에도 추가해야 한다. 라이브러리는 junit.jar 또는 icu4j.jar 같은 JAR 파일로 배포된다. 이 경우, classpath에 추가하는 것은, JAR 파일 그 자체이다. 이것을 포함하고 있는 디렉토리가 아니다." - from IBM(위의 링크 참조)
랜다.

서드 파티 라이브러리 사용시엔 jar파일 자체를 추가해야 된단 말인가라고 생각하여

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar src\test\xml\XMLMain.java

로 했더니 깔끔하게 컴파일되었다.
음. 나름 이 업계서 먹고 살아왔는데도 기본을 잘 모르는군... 반성 반성...

이제 남은 건 실행.
bin폴더에 컴파일했으므로 bin폴더로 이동해서 다음과 같이 실행

E:\workspace\java_run_test\bin>java test.xml.XMLMain

당연히 될리 없다. dom4j관련 라이브러리 참조를 위해 classpath 지정

E:\workspace\java_run_test\bin>java -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

왠걸. 에러다.
Exception in thread "main" java.lang.NoClassDefFoundError: test/xml/XMLMain
Caused by: java.lang.ClassNotFoundException: test.xml.XMLMain
        at java.net.URLClassLoader$1.run(Unknown Source)

현재 지정된 클래스패스에서 test.xml.XMLMain를 못찾고 있다. 컴파일 타겟인 bin폴더를 지정안했으니 당연한 것인가라고 생각해서 다시 시도

E:\workspace\java_run_test\bin>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

역시 에러. bin폴더에서 bin을 지정하고 있으니 문젠가 싶어서 상위 폴더로 이동 후 재실행

E:\workspace\java_run_test>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

옷. 된다. (사실 또다른 라이브러리가 필요해서 에러가 발생했으나 문제는 파악되었으니 무시무시)

이게 완성된 실행문

E:\workspace\java_run_test>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar;E:\workspace\java_run_test\Lib\jaxen-1.1-beta-6.jar test.xml.XMLMain
java.net.ConnectException: Connection refused: connect --> 에러났으나 실행은 되었으니까 무시.

결론

javac -verbose -d bin(타겟 디렉토리) -sourcepath src(소스 디렉토리) -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar(컴파일에 필요한 서드 파티 라이브러리의 경우 디렉토리path가 아닌 fie path) src\test\xml\XMLMain.java(실제 컴파일할 자바 소스-main()이 있는 클래스만 해도 연관된 것은 자동으로)


java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar;E:\workspace\java_run_test\Lib\jaxen-1.1-beta-6.jar(실행 시 필요한 서드 파티 라이브러리&컴파일된 class파일이 있는 디렉토리) test.xml.XMLMain(실행시킬 풀 클래스명)