자바의 classpath 를 사용하는 이유는 프로그램을 작성하면서 참조하는 다양한 라이브러리의 경로를 명시하여, jvm 구동시 이를 동적으로 링크하기 위함이다.
이를 지정하는 방법은 크게 두가지로 구분할 수 있다. 한가지는 시스템이 제공하는 환경변수 설정을 이용하는 방법, 두번째는 java 구동환경에서 option 을 설정을 통해서 명시적으로 지정하는 방법이다.
1. 환경 변수를 이용한 설정
운영체제는 시스템 운영상 필요한 경로를 시스템에 지정해두고서 참조하는 것이 가능하다. 이를 환경 변수라고 부르는데, 자바도 이곳에 필요한 경로를 설정해두고서 이용하는 것이 가능하다.
필요한 환경변수는 Path, CLASSPATH 두개의 환경변수가 필요하며, 첫번째 Path는 운영체제가 명령어를 실행하면서 해당 명령어에 맞는 실행파일을 찾아가는 순서를 명시한 환경변수이다.
이곳에 아래와 같은 식으로 설정을 함으로써 어떤 폴더에서나 자바의 컴파일러인 javac를 접근할 수 있다.
PATH=C:\Program Files\Java\jre1.6.0_05\bin;%SystemRoot%\system32;%SystemRoot%;
CLASSPATH= .;C:\Program Files\Java\jre1.6.0_05\lib\;
문제는 이렇게 환경변수를 설정하는 경우 컴파일시 다른 버전의 컴파일러를 실행하기 위해서는 변수 설정이 안됐을 때와 마찬가지로 절대경로로 접근해야하는 문제가 존재한다. 이런 상황에서 변리한 버전 변경을 위해서 아래와 같은 테크닉을 이용한다.
또한, 상기에서 보면 CLASSPATH에 현재 경로를 의미하는 . 를 추가했는데, 이는 자바 컴파일러가 명시적으로 CLASSPATH를 지정할 경우 현재 경로를 보지 않기 때문에 환경 변수상에서 현재 폴더를 추가해야만 정상적인 실행이 가능하기 때문이다.
JAVAPATH= C:\Program Files\Java\jre1.6.0_05;
PATH= %JAVAPATH%\bin;%SystemRoot%\system32;%SystemRoot%;
CLASSPATH= .; %JAVAPATH%\lib\;
즉, 환경변수는 시스템내에서 %{environmental variables}%의 형대로 참조가 가능하다. 이렇게 설정을 할 경우 다른 버전의 자바 컴파일러를 사용할 경우JAVAPATH 만을 변경해주면 된다.
Option 을 이용한 설정
환경 변수를 시스템에 설정하지 않고도 클래스 패스를 지정하는 것이 가능한데, 이는javac, java를 이용해서 실행할 때 –classpath 라는 옵션을 사용하는 것이다.
이 경우에는 윈도우의 경우 아래의 형태로 일단 사용이 가능하다.
java –classpath “C:\Program Files\Java\jre1.6.0_05\lib”;. HelloWorld
주의점은 경로상에 빈칸이 존재하는 경우에는 경로를 반드시 “”를 이용해서 묶어줘야 한다. 또한 만약 자바의 경로를 환경변수 상에 지정한 경우라면 아래와 같은 형태의 표현도 가능하다.
java –classpath %JAVAPATH%\bin;. HelloWorld
이 경우 마찬가지로 자바의 경로상에 빈칸이 존재하는 경우라면 환경변수 설정된 디렉토리를 “”로 묶어줘야 한다.
==============UNIX Java CLASSPATH=============
개요: Java CLASSPATH의 정의 및 설정 방법
세부 설명:
- Java CLASSPATH란 무엇이고 이것은 어떻게 설정해야 합니까?
소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 "바이트 코드"(바이너리 형태의 .class 파일)로 변환됩니다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 합니다. .class 파일을 찾을 때 classpath에 지정된 경로를 사용합니다. classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록입니다. java runtime은 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class 파일을 찾습니다. 찾으려는 클래스 코드가 포함된 .class 파일을 찾으면 첫 번째로 찾은 파일을 사용합니다.
두 가지 방법으로 classpath를 지정할 수 있습니다. 하나는 환경 변수 CLASSPATH를 사용하는 방법이고, 또 하나는 java runtime에 -classpath 플래그를 사용하는 방법입니다. -classpath 플래그 사용에 대한 자세한 설명은 java 메뉴얼 페이지를 참조하십시오.
- classpath에 어떤 값을 사용할 수 있습니까?
앞에서 설명한 대로 classpath는 콜론으로 구분된 디렉토리 및 파일 목록입니다. 다음 세 가지 유형의 파일과 디렉토리를 classpath에 지정할 수 있습니다.
/export/home/username/java/classes와 같은 디렉토리
myclasses.zip과 같은 zip 파일
myclasses.jar와 같은 jar(자바 아카이브) 파일
예를 들어 세 가지 유형을 모두 사용하면 다음과 같이 지정할 수 있습니다.
/export/home/username/java/classes:/export/home/username/java/classes/util.zip:/e
xport/home/username/java/classes/checkers.jar
.zip 파일과 .jar 파일은 하나의 아카이브로 압축된 자바 클래스 파일 세트입니다.
- classpath는 어떻게 사용합니까?
기본적으로 패키지에 포함되지 않은 java 소스 파일을 컴파일할 때 classpath를 설정하게 됩니다(뒤에 설명). java 파일 이름을 foo.java로 지정했다고 가정하겠습니다. 그런 다음 'javac foo.java' 명령을 사용해서 파일을 컴파일합니다. 그러면 javac 명령을 실행한 디렉토리에 컴파일된 .class 파일이 생성됩니다. 이 디렉토리를 /export/home/username이라고 가정하겠습니다. 이 디렉토리에 /export/home/username/foo.class라는 파일이 생깁니다. 그런 다음 foo.java 파일에 포함된 java 프로그램을 실행하려면 다음과 같이 classpath를 설정해야 합니다.
CLASSPATH=/export/home/username
현재 작업 디렉토리가 /export/home/username이면 다음과 같이 간단하게 classpath를 설정할 수 있습니다.
CLASSPATH=.
다른 디렉토리(예: /export/home/username/util)에 클래스 파일이 더 있으면, 다음과 같이 classpath를 설정해야 합니다.
CLASSPATH=/export/home/username:/export/home/username/util
util 디렉토리에 유용한 java 클래스가 많이 있으면 util.jar라는 jar 파일에 모두 묶을 수 있습니다. (/export/home/username/util/util.jar이라는 파일이 생깁니다.) 그러면 다음과 같이 classpath를 설정해야 합니다.
CLASSPATH=/export/home/username:/export/home/username/util/util.jar
지금까지는 classpath가 간단하지만 패키지를 사용하기 시작하면 복잡해집니다. 패키지는 java에서 관련 기능에 따라 클래스를 계층 구조로 연결하는 방법입니다. 좋은 예로 java.awt 패키지가 있습니다. java.awt 팩키지에는 GUI(예: 버튼, 텍스트 필드, 창 등)와 연결된 클래스 그룹이 포함되어 있습니다. 자신의 패키지를 만들 수도 있습니다. java에서는 .java 소스 파일의 첫 번째 행에 패키지 명령을 추가하는 방법으로 클래스가 패키지에 포함되었음을 나타낼 수 있습니다. MyCompany.Util 팩키지를 생성하려면 다음 행을 java 소스 파일에 추가해야 합니다.
package MyCompany.Util;
/export/home/username/util/foo.java라는 파일이 있고, foo.java 파일에 이 파일이 MyCompany.Util 팩키지에 포함되었음을 나타내는 행이 있다고 가정하겠습니다. /export/home/username/util 디렉토리로 이동해서 다음 명령으로 foo.java 파일을 컴파일하면 /export/home/username/util/foo.class 파일이 생깁니다.
javac foo.java
그러나 다음 명령으로 프로그램을 실행하려고 하면, foo 클래스를 찾을 수 없기 때문에 java runtime이 프로그램을 실행하지 못합니다.
CLASSPATH=/export/home/username/util
java foo
이것은 foo 클래스의 실제 이름이 MyCompany.Util.foo이기 때문입니다(팩키지에 추가했기 때문). 이 java 프로그램을 실행하려면 대신 다음 명령을 사용해야 합니다.
CLASSPATH=/export/home/username/util
java MyCompany.Util.foo
java에서는 현재 작업 디렉토리 대신 다른 디렉토리를 클래스 파일의 디렉토리로 지정할 수 있습니다. 이것을 지정할 때 -d 플래그를 사용합니다. 예를 들어, 다음과 같이 사용합니다.
javac -d /export/home/username/util foo.java
이렇게 지정하고 컴파일하면 /export/home/username/util 디렉토리에 클래스 파일이 생성되지만, /export/home/username/util 디렉토리 대신 MyCompany/Util이라는 하위 디렉토리를 만들어서 클래스 파일을 넣습니다. 위의 javac 명령을 실행하면 결과로 /export/home/username/util/MyCompany/Util/foo.class 파일이 생성됩니다. -d 플래그를 사용하면 소스 파일에 사용한 패키지 이름에 해당하는 디렉토리를 만듭니다(없을 경우). -d 플래그를 사용하지 않으면 이 디렉토리가 생성되지 않습니다. 이 시나리오에서 java 프로그램을 실행하려면 다음과 같이 classpath를 지정하고 java 명령을 실행해야 합니다.
CLASSPATH=/export/home/username/util
java MyCompany.Util.foo
기본적으로 패키지 하위 디렉토리가 있는 루트 디렉토리를 지정해야 합니다. 클래스 파일이 /export/home/username/util/MyCompany/Util 디렉토리에 있어도 classpath에 /export/home/username/util 경로를 지정해야 합니다. java는 설치 디렉토리에서 MyCompany/Util 디렉토리를 찾습니다. 또 패키지에 포함할 java 클래스를 생성할 경우에는 .jar 및 .zip 파일에 이 클래스를 넣을 수도 있습니다. 위의 시나리오에서 유틸리티 클래스가 포함된 jar 파일을 생성하려면 다음 명령을 사용해야 합니다.
cd /export/home/username/util
jar -cvf util.jar MyCompany/Util/*.class
그러면 내부에 MyCompany 및 MyCompany/Util 하위 디렉토리가 포함된 jar 파일이 생성됩니다. 이 jar 파일을 사용하려면 다음 명령을 실행하십시오.
CLASSPATH=/export/home/username/util/util.jar
java MyCompany.Util.foo
참고: 클래스 파일이 단순한 자바 클래스인지 아니면 패키지에 포함된 java 클래스인지 쉽게 구별할 수 없습니다. /export/home/username/util/MyCompany/Util/foo.class 파일을 보면 클래스 이름이 MyCompany.Util.foo일 가능성이 많지만, 반드시 그런 것은 아닙니다. 개발자가 디렉토리를 만들고 foo 클래스를 패키지에 넣지 않았을 수도 있습니다! 대부분의 경우에 이런 상황을 걱정할 필요는 엄만, 컴파일러가 클래스를 찾을 수 없는 문제가 발생하면 이런 경우를 생각해야 합니다.
- classes.zip 파일은 무엇이고 어떻게 classpath에 이 파일을 지정합니까?
classes.zip 파일은 1.1 기반 Java Runtime의 표준 클래스가 모두 포함된 아카이브 파일입니다. 예를 들어, java.awt, java.io, java.net 등의 팩키지에 있는 클래스가 모두 여기에 포함되어 있습니다. JDK(Java Development Kit) 1.1 이전에는 classes.zip 파일을 classpath에 포함시켜야 했습니다. 그러나 1.1 버전부터는 classes.zip 파일을 classpath에 포함시키면 안됩니다. java가 자동으로 classes.zip 파일을 찾을 수 있습니다. classes.zip 파일을 classpath에 지정하면 지정하지 않을 때보다 더 많은 문제가 발생합니다. 일반적으로 다음과 같은 문제가 발생합니다. 예를 들어, jdk1.1.4를 설치할 때 포함된 classes.zip 파일을 classpath에 추가한다고 가정하겠습니다. classes.zip 파일을 .cshrc와 같은 쉘 시작 파일 중 하나에 추가하고 나서 classes.zip 파일을 추가한 사실을 잊습니다. 나중에 새 JDK 버전을 시스템에 추가합니다. 이 때 전에 classes.zip 파일의 경로를 지정한 것을 기억하지 못합니다. 그러나 새 jdk를 사용하면 경로에서 이전의 classes.zip 파일을 먼저 찾게 되기 때문에 이전의 클래스가 사용됩니다. 따라서 java 프로그램은 실행되지 않고 문제와 관련이 없는 오류 메시지가 나옵니다.
- rt.jar 파일은 무엇이고 어떻게 classpath에 이 파일을 지정합니까?
JRE(Java Runtime Environment)와 JDK(Java Development Kit) 사이에는 차이가 있습니다. JRE는 JDK 중에서 java 프로그램을 실행하는(java 프로그램을 빌드하지는 않고) 프로그램만 포함된 환경입니다. 따라서 JRE는 classes.zip 파일에서 클래스를 찾지 않습니다. 대신 rt.jar 파일을 사용합니다. 이 rt.jar 파일에는 classes.zip과 동일한 클래스가 모두 포함되어 있고, 아카이브 형식과 이름만 다른 것을 사용합니다. Java 1.2가 발표되면서 classes.zip 파일은 없어졌습니다. 대신 JDK와 JRE가 모두 rt.jar 파일을 사용합니다. rt.jar 파일을 classpath에 지정해야 하는가에 대해서는 classes.zip 파일과 동일한 규칙이 적용됩니다. 즉, 지정할 필요가 없습니다. 그 이유는 위의 질문에 대한 설명을 참조하십시오.
제품 영역: Java
제품: JDK
SUNOS 릴리즈: 모든 릴리즈
하드웨어: 모든 하드웨어
============================================
================WINDOW JAVA 환경변수 설정하기=======================
[2000, xp]
내컴퓨터]-[속성]-[고급]-[환경변수]에서 PATH와 CLASSPATH를 적어넣어주셔야하는데요. 만약 자바를 잘 못하시고 컴에 대한 지식이 없으시면 될수 있으면 손대지 않는 것이 좋습니다. 그리고 입력을 하실때는 원래있던 내용들이 삭제되지 않게 조심하셔야합니다. 단 환경변수에서 사용자변수나 시스템변수에 등록을 해주시면 되는데요.
시스템변수에서 PATH가 없으면 새로만들기 해서 이름에 PATH 내용에
C:\자바설치폴더명\bin;.;
CLASSPATH가 없으면 새로만들기 해서 이름에 PATH 내용에
C:\자바설치폴더명\jre\lib\rt.jar;.;
아래 설명 참조 ---------------------------------------------------------
jdk1.6.0을 기준으로 설명함
시작 > 설정 > 제어판 > 시스템 > 고급 > 환경변수 > 시스템 변수 또는 사용자 변수 (나는 개인 PC이므로 시스템 변수 선택함)
새로만들기 클릭 > 변수 이름: JAVA_HOME, 변수 값: C:\Program Files\Java\jdk1.6.0
변수: CLASSPATH
값: .;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;
변수: PATH (수정)
이미 입력되어 있는 값들의 제일 뒤에다가 ;%JAVA_HOME%\bin; 추가
댓글
댓글 쓰기