클래스의 검색 방법

SDK 툴

Java 기동 툴이 클래스를 검색하는 방법

Java 기동 툴 java 는, Java 가상 머신 (VM)을 기동합니다. 가상 머신은, 다음의 순서로 클래스를 검색해 로드합니다.

실제로는, 이 3 개의 검색 패스는 1 개의 심플한 클래스 패스에 결합됩니다. 이것은, 이전에 사용되고 있던 「평탄한」클래스 패스를 닮아 있습니다만, 현재의 모델에게는 중요한 차이점이 몇개인가 있습니다.

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)를 사용자 클래스 패스에 추가합니다. 다만, 이 추가 후의 사용자 클래스 패스는, 툴을 실행하기 위해(때문에)인 만큼 사용됩니다. 원시 코드를 처리하는 툴 (javacjavadoc)은, 추가 후의 클래스 패스는 아니고, 원의 클래스 패스를 사용합니다. (자세한 것은, 이후에의「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.Smart

Java 기동 툴이 사용자 클래스를 검색하는 방법

사용자 클래스는, 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 에 기입합니다. 이 값은, 다음의 몇개의 소스로부터 취득됩니다.

Java 기동 툴이 JAR-class-path 클래스를 검색하는 방법

JAR 파일에는 일반적으로, 「Manifest」(그 JAR 의 내용을 일람표 가리킨 파일)이 포함됩니다. Manifest에서는, 클래스 패스를 한층 더 확장하는 JAR-class-path 를 정의할 수 있습니다. 다만, 패스가 확장되는 것은, 그 JAR 파일로부터 클래스를 로드하고 있는 동안 뿐입니다. JAR-class-path 에 의해 액세스 되는 클래스는, 다음의 순서로 검색됩니다.

javac 와 javadoc 가 클래스를 검색하는 방법

javacjavadoc 의 각 툴은, 2 개(살)이 다른 방법으로 클래스 파일을 사용합니다.

원시 코드의 참조를 해결하기 위해서 사용되는 클래스 파일의 대부분은,javacjavadoc 의 실행에 사용되는 것과 같은 클래스 파일입니다. 다만, 몇개의 중요한 예외가 있습니다.

참조 클래스가 클래스 파일과 원시 파일의 양쪽 모두로 정의되고 있는 경우,javadoc 는 항상 원시 파일을 사용합니다 (javadoc 는 원시 파일을 컴파일 하지 않는다). 같은 상황의 경우에,javac 는 클래스 파일을 사용합니다만, 낡아졌다고 판단되는 클래스 파일은 자동적으로 재컴파일 합니다. 자동재컴파일의 규칙에 대해서는,Windows 또는 Solaris 용의 javac 문서로 설명되고 있습니다.

디폴트에서는,javacjavadoc 는, 사용자 클래스 패스로부터 클래스 파일과 원시 코드 파일의 양쪽 모두를 검색합니다. -sourcepath 옵션이 지정되고 있는 경우,javacjavadoc 는, 지정된 원시 파일 패스의 원시 파일만을 검색합니다. 다만, 클래스 파일은과 같이 사용자 클래스 패스로부터 검색됩니다.

클래스의 로드와 시큐리티 정책

클래스 또는 인터페이스를 사용하기 위해서는, 클래스 로더로 로드할 필요가 있습니다. 특정의 클래스 로더의 사용법에 의해, 그 클래스 로더에 관련하는 시큐리티 정책가 결정됩니다.

프로그램에서는, 클래스 로더 객체의 loadClass 메소드를 호출하는 것으로, 클래스 또는 인터페이스를 로드할 수가 있습니다. 다만, 일반적으로, 프로그램은 단지 참조하는 것에 의해 클래스나 인터페이스를 로드합니다. 클래스나 인터페이스를 참조하면(자), 내부 클래스 로더가 불려 갑니다. 내부 클래스 로더는, 시큐리티 정책를 확장 기능과 사용자 클래스에 적용할 수가 있습니다. 시큐리티 정책가 유효하게 되지 않은 경우는, 어느 클래스도 「신뢰할 수 있다」라고 판단됩니다. 시큐리티 정책가 유효한 경우에서도, bootstrap 클래스에는 시큐리티 정책는 적용되지 않고, 항상 「신뢰할 수 있다」라고 보입니다.

시큐리티 정책가 유효한 경우, 시큐리티 정책는, 시스템 정책 파일과 사용자 정책 파일에 의해 설정됩니다. Java 2 SDK 에는, 시스템 정책 파일이 짜넣어지고 있습니다. 이 정책 파일은, 확장 기능 클래스는 「신뢰할 수 있다」상태로서 인가해, 사용자 클래스에는 기본적인 제한을 부과합니다.

시큐리티 정책의 설정과 유효화에 대해서는,「시큐리티」를 참조해 주세요.

주:Java 1.1 플랫폼에서 사용되고 있던 시큐리티 프로그래밍 기법안에는, Java 2 플랫폼의 클래스 로드 모델과 호환성이 없는 것이 있습니다.


Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software