xml version="1.0" encoding="utf-8"? >
클래스 패스는, Java 실행 환경이 클래스 및 다른 원시 파일을 검색하는 패스입니다. 클래스 검색 패스 ( 「클래스 패스」라고 하는 짧은 이름이 일반적)의 설정은, JDK 툴을 호출할 때
-classpath옵션을 붙이는 방법 (추천 되는 방법)인가,CLASSPATH환경 변수를 설정하는 방법에 의해 실시합니다.-classpath옵션이 추천 되고 있는 것은, 어플리케이션 마다 개별적으로 설정할 수 있으므로, 다른 어플리케이션에 영향을 주거나 다른 어플리케이션으로부터 이 값이 변경 되거나 하는 것이 없기 때문입니다.
%sdkTool-classpathclasspath1:classpath2...-또는―
% setenv CLASSPATHclasspath1:classpath2...설명
- sdkTool
- 커멘드행 툴 (
java,javac,javadoc,apt등)입니다. JDK 툴의 리스트는,「JDK 툴과 유틸리티」 를 참조해 주세요.- classpath1
:classpath2- . jar,. zip, 또는 . class 파일에의 클래스 패스입니다. 각 classpath 의 말미는, 파일명이나 디렉토리의 어느 쪽인지입니다. 이것은, 클래스 패스에 무엇을 설정할까에 따라서 다릅니다.
- . jar 또는 . zip 파일 (. class 파일을 포함한다)의 경우, 클래스 패스는 . zip 또는 . jar 파일의 이름으로 끝난다
- 이름이 없는 패키지내의 . class 파일의 경우, 클래스 패스는 . class 파일을 포함한 디렉토리의 이름으로 끝난다
- 이름 첨부의 패키지내의 . class 파일의 경우, 클래스 패스는 루트 패키지 (완전 지정의 패키지명의 선두 패키지)가 들어간 디렉토리의 이름으로 끝난다
복수의 패스 엔트리를 설정하는 경우는, 구두점으로 단락짓습니다.
디폴트의 클래스 패스는, 현재의 디렉토리입니다. 이 디폴트는,
CLASSPATH변수를 설정하거나-classpath커멘드행 옵션을 사용하거나 하면(자) 오버라이드(override) 됩니다. 그 때문에, 검색 패스에 현재의 디렉토리를 포함하는 경우에는, 새로운 설정에 「. 」(을)를 포함할 필요가 있습니다.디렉토리 및 어카이브(archive) (. zip 또는 . jar 파일) 이외의 클래스 패스 엔트리는, 무시됩니다.
클래스 패스는 JDK 툴 및 Java 어플리케이션에 대해서, 서드 파티제의 클래스 및 사용자 정의의 클래스, 즉확장 기능이나 Java 플랫폼의 일부에서는 없는 클래스를 찾는 위치를 통지합니다. 클래스 패스로는, javac 컴파일러로 컴파일 한 모든 클래스가 검출될 필요가 있습니다. 그러한 클래스를 간단하게 검출할 수 있도록(듯이), 디폴트는 현재의 디렉토리가 되어 있습니다.
JDK, JVM, 및 그 외의 JDK 툴에서는, Java 플랫폼 (bootstrap)의 클래스, 확장 기능의 클래스, 그리고 클래스 패스라고 하는 순서로 클래스가 검색됩니다. 검색에 대한 자세한 것은,「클래스의 검색 방법」을 참조해 주세요. 대부분의 어플리케이션의 클래스 라이브러리에서는,Java 확장 기능 기구를 이용하고 있을 것입니다. 클래스 패스를 설정할 필요가 있는 것은, (a) 현재의 디렉토리 또는 그 서브 디렉토리내에 없는 클래스나, (b) 확장 기능 기구에 의해 지정된 위치에 없는 클래스를 로드할 필요가 있는 경우만입니다.
구버젼의 JDK 를 업그레이드 하고 있는 경우는, 불필요하게 된
CLASSPATH환경 변수의 설정이 기동 설정에 포함되어 있는 일이 있습니다. 이 때문에,classes.zip등, 어플리케이션 고유하지 않는 설정은, 모두 삭제할 필요가 있습니다. Java 가상 머신을 사용하는 서드 파티제 어플리케이션안에는, 사용하는 라이브러리를 인클루드 하기 위해서CLASSPATH환경 변수를 변경하는 것이 있습니다. 이러한 설정은 남겨 두어도 괜찮습니다.클래스 패스를 변경하려면 , JVM 또는 다른 JDK 툴을 기동할 경우에 JDK 툴의 -classpath 옵션을 사용하는지, 또는
CLASSPATH환경 변수를 사용합니다.CLASSPATH환경 변수를 설정하는 것보다도,-classpath옵션을 사용하는 것을 추천합니다. 어플리케이션 마다 개별적으로 설정할 수 있으므로, 다른 어플리케이션에 영향을 주거나 다른 어플리케이션으로부터 이 값이 변경 되거나 하는 것이 없기 때문입니다.클래스는, 디렉토리 (폴더) 또는 archive파일에 포함할 수 있습니다. Java 플랫폼의 클래스는,
rt.jar에 포함되고 있습니다. 어카이브(archive)의 상세 및 클래스 패스의 기능에 대해서는,「클래스 패스와 패키지명에 대하며」를 참조해 주세요.
- 중요:일부의 구버젼의 JDK 소프트웨어에서는, 디폴트의 클래스 패스에
<jdk-dir>/classes엔트리가 포함되어 있습니다. 이 디렉토리는, JDK 소프트웨어가 사용하기 위한의 것입니다. 어플리케이션의 클래스를 위해서(때문에)는 사용하지 말아 주세요. 어플리케이션의 클래스는, JDK 의 디렉토리 계층은 아닌, 외부의 디렉토리에 두어 주세요. 그러면, 새로운 JDK 를 인스톨 했을 때에, 어플리케이션의 클래스를 재인스톨 할 필요가 없어집니다. 구버젼과의 호환성을 확보하기 위해(때문에),<jdk-dir>/classes디렉토리를 클래스 라이브러리로서 사용하는 어플리케이션도, 현재의 버젼에서는 실행할 수 있습니다. 다만, 장래의 버젼에서도 실행할 수 있다고 하는 보증은 없습니다.
Java 툴 java ,jdb ,javac , 및 javah 에는,
-classpath옵션이 있습니다. 이 옵션은, 툴의 실행중에,CLASSPATH환경 변수에 의해 지정된 1 개(살) 또는 복수의 패스를 다른 패스에 옮겨놓습니다. 클래스 패스의 설정을 변경하는 경우는, 이 방법을 추천합니다. 각 어플리케이션이, 다른 어플리케이션에 영향을 주지 않고 , 자신에게 필요한 클래스 패스를 설정할 수 있기 때문입니다.실행시 툴 java 에는,
-cp옵션도 있습니다. 이 옵션은,-classpath의 생략형입니다.매우 특수한 케이스를 위해서(때문에),java 와 javac 에는, 툴 자체의 클래스 라이브러리 검색용 패스를 변경하기 위한 옵션이 있습니다. 다만, 대부분의 사용자는 이 옵션을 사용할 필요는 없습니다.
전술대로, 클래스 패스를 변경하려면 , 일반적으로,
-classpath커멘드행 옵션을 사용합니다. 여기에서는, 필요한 경우에CLASSPATH환경 변수를 설정하는 방법과 구버젼의 인스톨시부터 남아 있는 설정을 해제하는 방법을 설명합니다.
csh 에서는,
setenv커멘드를 사용해CLASSPATH환경 변수를 수정합니다. 커멘드의 형식은, 다음과 같습니다.
setenv CLASSPATHpath1:path2sh 에서는, 다음의 커멘드를 사용해
CLASSPATH환경 변수를 수정합니다.
sdkTool-classpathpath1;path2...
export CLASSPATH
CLASSPATH환경 변수로 설정되어 있는 값이 올바르지 않은 경우나, 기동 파일이나 스크립트가 잘못한 패스를 설정해 있는 경우, csh 에서는, 다음의 커멘드로CLASSPATH의 설정을 해제할 수 있습니다.
unsetenv CLASSPATHsh 에서는, 다음의 커멘드를 사용합니다.
unset CLASSPATH이러한 커멘드는, 현재의 쉘에 대한 보고,
CLASSPATH의 설정을 해제합니다. 다음번 이후의 세션에서도CLASSPATH가 올바르게 설정되도록(듯이) 하려면 , 기동 설정을 삭제 또는 수정할 필요가 있습니다.
CLASSPATH환경 변수가 시스템의 기동시로 설정되어 있는 경우, 그 설정 장소는, 실행하고 있는 쉘에 따라서 다릅니다.
쉘 기동 스크립트 csh, tcsh . cshrc파일내의setenv커멘드가 기술되고 있는 개소를 찾는다sh, ksh . profile파일내의export커멘드가 기술되고 있는 개소를 찾는다
베이스명의 와일드 카드 문자 * 를 포함한 클래스 패스 엔트리는, 디렉토리내의 확장자(extension)
. jar또는. JAR를 가지는 모든 파일의 리스트를 지정한 것과 동등하다라고 보입니다. 예를 들어, 클래스 패스 엔트리foo/*는foo라고 하는 디렉토리내의 모든 JAR 파일을 지정합니다. * 만일 수 있는으로부터 완성되는 클래스 패스 엔트리는, 커런트 디렉토리내의 모든 JAR 파일의 리스트에 전개됩니다. 파일은, 숨겨지고 있다 (즉, 이름이 「.」(으)로 시작된다) 화도인가에 관계없이 고려됩니다.* (을)를 포함한 클래스 패스 엔트리는, 클래스 파일에는 일치하지 않습니다. 단일의 디렉토리
foo내에서 클래스 파일과 JAR 파일의 양쪽 모두에 일치하려면 ,foo:foo/*또는foo/*:foo를 사용합니다. 선택된 순서에 의해,foo내의 클래스 및 자원이foo내의 JAR 파일의 전에 (또는 그 역으로) 로드 될지 어떨지가 정해집니다.서브 디렉토리는 재귀적으로 검색되지 않습니다. 예를 들어,
foo/*에서는foo내의 JAR 파일만을 검색해,foo/bar,foo/baz등은 검색하지 않습니다.디렉토리내의 JAR 파일이 전개된 클래스 패스로 열거되는 순서는 지정되지 않고, 플랫폼에 의해, 혹은 같은 머신상에서도 시간에 따라서 다른 경우가 있습니다. 잘 구성된 어플리케이션은, 특정의 순서에 의존하지 않게 해야 합니다. 특정의 순서가 필요한 경우는, 클래스 패스로 JAR 파일을 명시적으로 열거할 수 있습니다.
와일드 카드의 전개는 조기에 행해져 클래스의 로드 처리 자체의 사이는 아니고, 프로그램의
main메소드의 호출전에 행해집니다. 와일드 카드를 포함한 입력 클래스 패스의 각 요소는, 지정한 디렉토리내의 JAR 파일을 열거해 생성된 요소의 순서 (빈 상태(empty)의 경우도 있다)에 의해 옮겨놓을 수 있습니다. 예를 들어, 디렉토리foo에a.jar,b.jar, 및c.jar가 포함되는 경우, 클래스 패스foo/*는foo/a.jar:foo/b.jar:foo/c.jar에 전개되어 캐릭터 라인은 시스템 프로퍼티java.class.path의 값이 됩니다.
CLASSPATH환경 변수는,-classpath(또는-cp) 커멘드행 옵션과 달라 다루어질 것은 없습니다. 즉, 모든 경우 와일드 카드가 우선됩니다. 다만, 클래스 패스 와일드 카드는Class-PathJAR Manifest의 헤더에서는 우선되지 않습니다.
Java 의 클래스는 패키지로서 편성되어 각 패키지는 파일 시스템내의 디렉토리에 매핑 되고 있습니다. 다만, 파일 시스템과는 달라, 패키지명을 지정할 때는, 패키지명의 일부에서는 없고 반드시 전체를 지정합니다. 예를 들어,
java.awt.Button의 패키지명은, 반드시java.awt와 지정할 필요가 있습니다.예를 들어, Java Runtime 가
utility.myapp패키지내의Cool.class라는 이름의 클래스를 찾도록(듯이) 설정하는 경우를 생각해 봅시다. 그 디렉토리에의 패스가/java/MyClasses/utility/myapp이면,/java/MyClasses를 포함하도록(듯이) 클래스 패스를 설정합니다.이 어플리케이션을 실행하려면 , 다음의 JVM 커멘드를 사용합니다.
% java -classpath /java/MyClasses utility.myapp.Cool어플리케이션을 실행할 때, JVM 는 클래스 패스의 설정을 사용해,
utility.myapp패키지내에 정의되고 있는,Cool클래스가 사용하는 것 외의 클래스를 검색합니다.이 커멘드에는 완전한 패키지명을 지정해 주세요. 예를 들어, 클래스 패스에
/java/MyClasses/utility가 포함되도록(듯이) 설정한 데다가, 커멘드java myapp.Cool를 사용할 수 없습니다. 그 클래스가 발견되지 않기 때문입니다.왜 이러한 클래스의 패키지명이 인정되지 않는 것인지 의문으로 생각할지도 모릅니다. 그것은, 클래스의 패키지명은 그 클래스의 일부이며, 변경할 수 없기 때문입니다. 패키지명을 변경하려면 , 클래스를 컴파일 다시 하지 않으면 안됩니다.
주:패키지 지정의 기구에 관련한 흥미로운 사례로서 「같은 패키지에 속하는 복수의 클래스 파일이, 실제로는 다른 디렉토리에 존재한다」라고 하는 상황이 가능합니다. 이 경우, 각 클래스의 패키지명은 같습니다만, 각각의 파일에의 패스는, 클래스 패스내의 다른 디렉토리에서 시작됩니다.
클래스가
/java/MyClasses/utility/myapp와 같은 디렉토리 (폴더)에 포함되고 있는 경우, 클래스 패스의 엔트리는, 패키지명의 선두의 요소가 포함되고 있는 디렉토리를 가리킵니다. 이 경우는, 패키지명이utility.myapp이므로/java/MyClasses를 가리킵니다.다만, 클래스가 archive파일 (. zip 파일 또는 . jar 파일) 안에 포함되고 있는 경우, 클래스 패스의 엔트리는, 그 . zip 파일 또는 . jar 파일에의 패스가 되어, 이러한 파일명도 포함해 지정합니다. 예를 들어,. jar 파일내의 클래스 라이브러리를 사용하려면 , 다음과 같은 커멘드를 사용합니다.
% java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool
디렉토리
/java/MyClasses내의 클래스와/java/OtherClasses내의 클래스를 검색하려면 , 클래스 패스를 다음과 같이 설정합니다.
% java -classpath /java/MyClasses:/java/OtherClasses ...2 살의 패스는 구두점으로 단락지어 주세요.
복수의 클래스 패스 엔트리를 지정하는 순서는 중요합니다. Java interpreter는, 클래스 패스 변수로 지정되고 있는 순서로 디렉토리를 조사해 클래스를 찾습니다. 위의 예에서는, Java interpreter는 최초로
/java/MyClasses디렉토리내로부터 필요한 클래스를 찾습니다. 이 디렉토리내에 해당하는 클래스명을 가지는 클래스가 발견되지 않았던 경우에만, interpreter는/java/OtherClasses디렉토리내를 검색합니다.
|
Copyright © 2004-2006 Sun Microsystems, Inc. All Rights Reserved. |
Java Software |