xml version="1.0" encoding="UTF-8"? >
클래스의 검색 방법 |
SDK 툴 |
Java 기동 툴 java 는, Java 가상 머신 (VM)을 기동합니다. 가상 머신은, 다음의 순서로 클래스를 검색해 로드합니다.
- bootstrap 클래스 - Java 플랫폼을 구성하는 클래스.
rt.jar와 다른 몇개의 중요한 JAR 파일내의 클래스가 포함된다- 확장 기능 클래스 - Java 확장 기능 기구를 사용하는 클래스. 확장 기능용 디렉토리에
. jar파일로서 번들 되고 있다- 사용자 클래스 - 개발자와 서드 파티에 의해 정의된, 확장 기능의 기구를 이용하지 않는 클래스. 이러한 클래스의 위치는, 커멘드행으로 -classpath 옵션을 사용하는 (추천)인가, CLASSPATH 환경 변수를 사용해 지정한다. 클래스 패스의 설정에 대해서는,Windows 또는 Solaris 용의 페이지를 참조
실제로는, 이 3 개의 검색 패스는 1 개의 심플한 클래스 패스에 결합됩니다. 이것은, 이전에 사용되고 있던 「평탄한」클래스 패스를 닮아 있습니다만, 현재의 모델에게는 중요한 차이점이 몇개인가 있습니다.
- bootstrap 클래스를 잘못해 「은폐」충분하고 생략 하거나 하는 실수가 비교적 적게 된다
- 일반적으로은, 사용자 클래스의 위치를 지정하는 것만으로 끝난다. bootstrap 클래스와 확장 기능 클래스는, 「자동적」으로 검출된다
- 툴의 클래스는, 현재는 다른 어카이브(archive) (tools.jar)로 나눌 수 있고 있어 사용자 클래스 패스에 포함되어 있는 경우에만 사용할 수 있다 (간단한 설명을 후술 한다)
Java 기동 툴이 bootstrap 클래스를 검색하는 방법
bootstrap 클래스는, Java 2 플랫폼을 구현하고 있는 클래스입니다. bootstrap 클래스는,
jre/lib디렉토리의rt.jar와 다른 몇개의 JAR 파일에 포함되고 있습니다. 이러한 어카이브(archive)는, 시스템 프로퍼티sun.boot.class.path에 포함되고 있는 bootstrap 클래스 패스의 값에 의해 지정됩니다. 이 시스템 프로퍼티은 참조 전용이므로, 직접 수정하지 말아 주세요.bootstrap 클래스 패스의 재정의가 필요하게 되는 것은 거의 없습니다. 보기 드물게, 다른 코어 클래스세트를 사용할 필요가 생겼을 경우에는, 비표준의 옵션 -Xbootclasspath 을 사용해 bootstrap 클래스 패스를 재정의할 수가 있습니다.
Java 2 SDK 툴을 구현하는 클래스는, bootstrap 클래스와는 다른 어카이브(archive)로 나눌 수 있고 있으므로, 주의해 주세요. 툴의 어카이브(archive)는, SDK 의
lib/tools.jar파일입니다. 개발툴은, 기동 툴을 호출할 때, 이 어카이브(archive)를 사용자 클래스 패스에 추가합니다. 다만, 이 추가 후의 사용자 클래스 패스는, 툴을 실행하기 위해(때문에)인 만큼 사용됩니다. 원시 코드를 처리하는 툴 (javac 와 javadoc)은, 추가 후의 클래스 패스는 아니고, 원의 클래스 패스를 사용합니다. (자세한 것은, 이후에의「javac 와 javadoc 가 클래스를 검색하는 방법」을 참조해 주세요. )Java 기동 툴이 확장 기능 클래스를 검색하는 방법
확장 기능 클래스는, Java 플랫폼을 확장하는 클래스입니다. 확장 기능 디렉토리 jre/lib/ext 내의
. jar파일은 모두 확장 기능으로 간주해져Java 확장 기능 시스템를 사용해 로드 됩니다. 확장 기능 디렉토리내에서 어디에도 속하지 않는 클래스 파일은, 찾아낼 수가 없습니다. 이러한 파일은,. jar 파일 (또는 . zip 파일) 안에 포함되어 있을 필요가 있습니다. 확장 기능 디렉토리의 위치를 변경하기 위한 옵션은 없습니다.jre/lib/ext 디렉토리에 복수의
. jar파일이 포함되어 있어 다음과 같이, 이러한 파일에 같은 이름의 클래스가 포함되어 있는 경우, 실제로 로드 되는 클래스는 미정도리가 됩니다.
smart-extension1_0.jar contains class smart.extension.Smart
smart-extension1_1.jar contains class smart.extension.SmartJava 기동 툴이 사용자 클래스를 검색하는 방법
사용자 클래스는, Java 플랫폼 위에 구축되는 클래스입니다. 사용자 클래스를 찾기 위해서(때문에), 기동 툴은, 「사용자 클래스 패스」(디렉토리, JAR 어카이브(archive), 클래스 파일이 들어간 ZIP 어카이브(archive)의 리스트)을 참조합니다.
클래스 파일에는, 그 클래스의 완전한 이름(FQN)을 나타내는 서브 경로명이 있습니다. 예를 들어, 클래스
com.mypackage.MyClass이/myclasses내에 포함되고 있는 경우,/myclasses는 사용자 클래스 패스내에 포함되지 않으면 안되어, 그 클래스 파일에의 풀 패스는/myclasses/com/mypackage/MyClass.class가 아니면 안됩니다. 클래스가myclasses.jar라는 이름의 어카이브(archive)내에 포함되고 있는 경우, 그myclasses.jar는 사용자 클래스 패스에 포함되지 않으면 안되어, 클래스 파일은 어카이브(archive)내에com/mypackage/MyClass.class로서 포함되어 있지 않으면 안됩니다.사용자 클래스 패스는 캐릭터 라인으로서 지정되어 Solaris 에서는 클래스 패스의 엔트리는 구두점 (
:)으로 단락지어져 Microsoft Windows 시스템에서는 엔트리는 세미콜론 (;)으로 단락지어집니다. Java 기동 툴은, 사용자 클래스 패스의 캐릭터 라인을 시스템 프로퍼티java.class.path에 기입합니다. 이 값은, 다음의 몇개의 소스로부터 취득됩니다.
- 디폴트 값 「
.」. 이 경우, 사용자 클래스 파일은, 현재의 디렉토리내의 모든 클래스 파일 (패키지내의 클래스 파일이라면, 현재의 디렉토리 이하에 있는 모든 클래스 파일)이다- CLASSPATH 환경 변수의 값. 이 값은, 디폴트 값를 오버라이드(override) 한다
- -cp 또는 -classpath 커멘드행 옵션의 값. 이 값은, 디폴트 값와 CLASSPATH 치의 양쪽 모두를 오버라이드(override) 한다
- -jar 옵션으로 지정된 JAR 어카이브(archive). 이 값은, 다른 모든 값을 오버라이드(override) 한다. 이 옵션을 사용하는 경우, 모든 사용자 클래스는, 지정된 어카이브(archive)로부터 검색할 수 있다
Java 기동 툴이 JAR-class-path 클래스를 검색하는 방법
JAR 파일에는 일반적으로, 「Manifest」(그 JAR 의 내용을 일람표 가리킨 파일)이 포함됩니다. Manifest에서는, 클래스 패스를 한층 더 확장하는 JAR-class-path 를 정의할 수 있습니다. 다만, 패스가 확장되는 것은, 그 JAR 파일로부터 클래스를 로드하고 있는 동안 뿐입니다. JAR-class-path 에 의해 액세스 되는 클래스는, 다음의 순서로 검색됩니다.
- 일반적으로, JAR-class-path 엔트리에 의해 참조되는 클래스는, JAR 파일의 일부인것 같이 검색된다. JAR-class-path 내의 JAR 파일은, 클래스 패스내에서 그 JAR 파일보다 전에 있는 엔트리의 뒤, 한편, 그 JAR 파일보다 나중에 있는 엔트리의 전에 검색된다
- 다만, JAR-class-path 가, 벌써 검색된 JAR 파일 (예를 들어, 확장 기능, 또는 클래스 패스내에서 그것보다 전에 기술되고 있는 JAR 파일)을 가리키고 있는 경우는, 그 JAR 파일이 재차 검색될 것은 없다. 이 최적화에 의해 효율이 향상해, 순환 검색이 회피된다. 이러한 JAR 파일은, 클래스 패스의 앞쪽에서 인식된 시점에서 검색된다
- JAR 파일이 확장 기능으로서 인스톨 되고 있는 경우는, 그 JAR 파일에 의해 정의되는 모든 JAR-class-path 는 무시된다. 확장 기능이 필요로 하는 클래스는 모두, SDK 의 일부인지, 그 자체가 확장 기능으로서 인스톨 되고 있으면(자) 상정된다
javac 및 javadoc 의 각 툴은, 2 개(살)이 다른 방법으로 클래스 파일을 사용합니다.
- 모든 Java 어플리케이션과 같게,javac 와 javadoc 를 실행하기 위해서는, 다양한 클래스 파일을 로드할 필요가 있다
- 처리 대상의 원시 코드를 처리하기 위해서,javac 와 javadoc 는, 원시 코드로 사용되고 있는 객체형의 정보를 취득할 필요가 있다
원시 코드의 참조를 해결하기 위해서 사용되는 클래스 파일의 대부분은,javac 와 javadoc 의 실행에 사용되는 것과 같은 클래스 파일입니다. 다만, 몇개의 중요한 예외가 있습니다.
- javac 와 javadoc 는 어느쪽이나,javac 또는 javadoc 의 구현과는 무관계한 클래스나 인터페이스에의 참조를 해결하는 것이 자주 있다. 참조되고 있는 사용자 클래스와 인터페이스에 관한 정보는, 클래스 파일 또는 원시 코드 파일 (혹은 그 양쪽 모두)의 형식에서 존재한다
tools.jar내의 툴 클래스는,javac 와 javadoc 를 실행하기 위해(때문에)인 만큼 사용된다. 툴 클래스는,tools.jar가 사용자 클래스 패스내로 지정되어 있지 않은 한, 원시 코드의 참조를 해결하기 위해서는 사용되지 않는다- 프로그래머는, 다른 Java 플랫폼 구현을 사용해, 부트 클래스나 확장 기능 클래스의 참조를 해결하고 싶은 경우가 있다. javac 와 javadoc 는 어느쪽이나,-bootclasspath 와 -extdirs 의 각 옵션에 의해, 이것을 지원한다. 이러한 옵션을 사용해도,javac 또는 javadoc 자체의 실행에 사용되는 클래스 파일세트는 변경되지 않는다
참조 클래스가 클래스 파일과 원시 파일의 양쪽 모두로 정의되고 있는 경우,javadoc 는 항상 원시 파일을 사용합니다 (javadoc 는 원시 파일을 컴파일 하지 않는다). 같은 상황의 경우에,javac 는 클래스 파일을 사용합니다만, 낡아졌다고 판단되는 클래스 파일은 자동적으로 재컴파일 합니다. 자동재컴파일의 규칙에 대해서는,Windows 또는 Solaris 용의 javac 문서로 설명되고 있습니다.
디폴트에서는,javac 와 javadoc 는, 사용자 클래스 패스로부터 클래스 파일과 원시 코드 파일의 양쪽 모두를 검색합니다. -sourcepath 옵션이 지정되고 있는 경우,javac 와 javadoc 는, 지정된 원시 파일 패스의 원시 파일만을 검색합니다. 다만, 클래스 파일은과 같이 사용자 클래스 패스로부터 검색됩니다.
클래스 또는 인터페이스를 사용하기 위해서는, 클래스 로더로 로드할 필요가 있습니다. 특정의 클래스 로더의 사용법에 의해, 그 클래스 로더에 관련하는 시큐리티 정책가 결정됩니다.
프로그램에서는, 클래스 로더 객체의 loadClass 메소드를 호출하는 것으로, 클래스 또는 인터페이스를 로드할 수가 있습니다. 다만, 일반적으로, 프로그램은 단지 참조하는 것에 의해 클래스나 인터페이스를 로드합니다. 클래스나 인터페이스를 참조하면(자), 내부 클래스 로더가 불려 갑니다. 내부 클래스 로더는, 시큐리티 정책를 확장 기능과 사용자 클래스에 적용할 수가 있습니다. 시큐리티 정책가 유효하게 되지 않은 경우는, 어느 클래스도 「신뢰할 수 있다」라고 판단됩니다. 시큐리티 정책가 유효한 경우에서도, bootstrap 클래스에는 시큐리티 정책는 적용되지 않고, 항상 「신뢰할 수 있다」라고 보입니다.
시큐리티 정책가 유효한 경우, 시큐리티 정책는, 시스템 정책 파일과 사용자 정책 파일에 의해 설정됩니다. Java 2 SDK 에는, 시스템 정책 파일이 짜넣어지고 있습니다. 이 정책 파일은, 확장 기능 클래스는 「신뢰할 수 있다」상태로서 인가해, 사용자 클래스에는 기본적인 제한을 부과합니다.
시큐리티 정책의 설정과 유효화에 대해서는,「시큐리티」를 참조해 주세요.
주:Java 1.1 플랫폼에서 사용되고 있던 시큐리티 프로그래밍 기법안에는, Java 2 플랫폼의 클래스 로드 모델과 호환성이 없는 것이 있습니다.
|
Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved. |
Java Software |