클래스 로더

클래스 로더는 클래스 파일을 찾아서 로드합니다. 클래스 로더를 사용하면 서버에 배치된 애플리케이션은 사용 가능한 클래스와 자원의 저장소에 액세스할 수 있습니다. 애플리케이션 개발자 및 배치자는 클래스와 자원 파일의 위치 및 이러한 파일에 액세스하는 데 사용되는 클래스 로더를 고려하여 파일을 배치된 애플리케이션에서 사용할 수 있도록 해야 합니다.

WebSphere® Application Server에서 클래스 로더에 대한 다음과 같은 정보를 참조하십시오.

사용되는 클래스 로더와 사용 순서

제품 런타임 환경은 다음 클래스 로더를 사용하여 애플리케이션에 대한 새 클래스를 찾아서 다음 순서로 로드합니다.

  1. 부트스트랩, 확장자 및 CLASSPATH 클래스 로더는 JVM(Java™ Virtual Machine)으로 작성됩니다.

    부트스트랩 클래스 로더는 부트 클래스 경로(일반적으로 jre/lib의 클래스)를 사용하여 클래스를 찾고 로드합니다. 확장 클래스 로더는 시스템 특성 java.ext.dirs(대개 jre/lib/ext)를 사용하여 클래스를 찾아서 로드합니다. CLASSPATH 클래스 로더는 CLASSPATH 환경 변수를 사용하여 클래스를 찾아 로드합니다.

  2. WebSphere 확장 클래스 로더

    WebSphere 확장 클래스 로더는 런타임에 필요한 WebSphere Application Server 클래스를 로드합니다. WebSphere Application Server 클래스는 OSGi 번들 세트로 제공됩니다. 각 번들은 OSGi 클래스 로더의 네트워크 내에의 개별 클래스 로더에 의해 로드됩니다. 확장 클래스 로더는 이 OSGi 클래스 로더 네트워크에서 클래스를 로드하도록 게이트웨이 클래스 로더에 위임합니다. OSGi 클래스 로더 네트워크로부터 내보내진 패키지는 게이트웨이를 통해 애플리케이션에 보이게 됩니다. 세부사항은 OSGi 클래스 로더 모델의 내용을 참조하십시오.

    참고: Java EE(Java Platform, Enterprise Edition) API(Application Programming Interface)는 javax.j2ee.*.jar 번들에서 제공되는데, OSGi 클래스 로더 네트워크 내에서 로드되고 게이트웨이를 통해 애플리케이션에 보이게 됩니다. OSGi 번들 내에서 배치되는 클래스가 Java 가상 시스템 클래스 로더에 보이지 않기 때문에, CLASSPATH 환경 변수나 java.ext.dirsjava.lang.classpath 시스템 특성을 사용하여 Java EE API에 의존하는 라이브러리에 대한 경로를 지정하지 마십시오. 또한, CLASSPATH, java.ext.dirsjava.lang.classpath를 사용하여 애플리케이션 라이브러리에 대한 경로를 지정하지 마십시오. 이들 라이브러리는 링크 오류 또는 예기치 않은 서버 동작을 유발할 수 있기 때문입니다.

    WebSphere 확장 클래스 로더는 ws.ext.dirs 시스템 특성을 사용하여 OSGi 번들에서 제공되는 것 이상의 클래스나 자원을 로드하는 데 사용되는 경로를 판별합니다. ws.ext.dirs 클래스 경로의 각 디렉토리와 이러한 디렉토리에 있는 모든 JAR(Java Archive) 파일 또는 압축 파일이 이 클래스 로더가 사용하는 클래스 경로에 추가됩니다.

    서버에 설치된 애플리케이션 모듈이 제공자와 연관된 자원을 참조하고, 제공자가 자원 드라이버의 디렉토리 이름을 지정하는 경우 WebSphere 확장 클래스 로더가 자원 제공자 클래스도 서버로 로드합니다.

  3. 서버에서 실행 중인 엔터프라이즈 애플리케이션 요소를 로드하는 하나 이상의 애플리케이션 모듈 클래스 로더.

    애플리케이션 요소에는 웹 모듈, 엔터프라이즈 Bean(EJB) 모듈, 자원 어댑터 아카이브(RAR 파일) 및 종속성 JAR 파일이 있습니다. 애플리케이션 클래스 로더는 엔터프라이즈 애플리케이션의 클래스 및 JAR 파일을 로드하기 위해 Java EE 클래스 로딩 규칙을 준수합니다. 제품에서는 공유 라이브러리를 애플리케이션과 연관시킬 수 있습니다.

  4. 0 이상의 웹 모듈 클래스 로더

    기본적으로, 웹 모듈 클래스 로더는 WEB-INF/classesWEB-INF/lib 디렉토리의 내용을 로드합니다. 웹 모듈 클래스 로더는 애플리케이션 클래스 로더의 하위입니다. 웹 모듈 클래스 로더 대신 애플리케이션 클래스 로더가 웹 모듈의 내용을 로드하도록 지정할 수 있습니다.

클래스 로더 계층 구조

이전 클래스 로더는 그 위에 있는 클래스 로더의 하위입니다. 즉, 애플리케이션 모듈 클래스 로더는 CLASSPATH Java 클래스 로더의 하위 요소인 WebSphere 확장 클래스 로더의 하위 요소입니다. 클래스를 로드해야 할 때마다 클래스 로더는 대개 요청을 상위 클래스 로더에 위임합니다. 어떤 상위 클래스 로더도 클래스를 찾을 수 없는 경우, 원래 클래스 로더가 클래스를 로드하려 시도합니다. 요청은 상위 클래스 로더로만 이동하며 하위 클래스 로더로 이동할 수 없습니다. WebSphere 확장 클래스 로더가 Java EE 모듈에서 클래스를 찾는 요청을 받으면 애플리케이션 모듈 클래스 로더로 이동하여 해당 클래스를 찾을 수 없으므로 ClassNotFoundException 오류가 발생합니다. 클래스 로더에서 클래스가 로드된 후, 로드하려 시도하는 새 클래스는 동일한 클래스 로더를 다시 사용하거나 해당 클래스를 찾을 때까지 이전 목록을 거슬러 올라갑니다.

클래스 로더 분리 정책

애플리케이션 모듈의 수 및 기능은 서버 구성에서 지정된 클래스 로더 정책에 따라 달라집니다. 클래스 로더는 애플리케이션과 모듈을 분리하기 위한 복수 옵션을 제공하여 다른 애플리케이션 패키징 설계가 애플리케이션 서버에서 실행할 수 있게 합니다.

두 개의 클래스 로더 정책이 응애플리케이션과 모듈의 분리를 제어합니다.

표 1. 클래스 로더 정책 설명. 사용 가능한 정책에는 애플리케이션 및 WAR이 포함됩니다.
클래스 로더 정책 설명
애플리케이션 애플리케이션 클래스 로더는 EJB 모듈, 종속성 JAR 파일, 임베디드 자원 어댑터 및 애플리케이션 범위의 공유 라이브러리를 로드합니다. 애플리케이션 클래스 로더 정책에 따라, 애플리케이션 클래스 로더가 여러 애플리케이션(단일)에 공유될 수 있거나 각 애플리케이션(다중)마다 고유할 수 있습니다. 애플리케이션 클래스 로더 정책은 시스템에서 실행 중인 애플리케이션의 분리를 제어합니다. 단일로 설정되면, 애플리케이션은 분리되지 않습니다. 다중으로 설정되면, 애플리케이션은 서로 분리됩니다.
WAR 기본적으로, 웹 모듈 클래스 로더는 WEB-INF/classesWEB-INF/lib 디렉토리의 내용을 로드합니다. 애플리케이션 클래스 로더는 웹 모듈 클래스 로더의 상위입니다. 애플리케이션의 WAR(웹 애플리케이션 아카이브) 클래스 로더 정책을 변경하여 기본 작동을 변경할 수 있습니다.

WAR 클래스 로더 정책은 웹 모듈의 분리를 제어합니다. 이 정책이 Application으로 설정되면, 웹 모듈 목차도 애플리케이션 클래스 로더에 의해(EJB 파일, RAR 파일, 종속성 JAR 파일 및 공유 라이브러리와 함께) 로드됩니다. 정책이 Module로 설정되면 각 웹 모듈은 상위가 애플리케이션 클래스 로더인 자체 클래스 로더를 수신합니다.

팁: 콘솔 및 기본 deployment.xml 파일은 WAR 클래스 로더 정책 값에 서로 다른 이름을 사용합니다. 콘솔에서 WAR 클래스 로더 정책 값은 애플리케이션 또는 모듈입니다. 그러나 정책이 설정되는 기본 deployment.xml 파일에서 WAR 클래스 로더 정책 값은 애플리케이션 대신 단일이거나 또는 모듈 대신 다중입니다. 애플리케이션단일과 동일하며, 모듈다중과 동일합니다.
제한사항: WebSphere Application Server 클래스 로더는 절대 애플리케이션 클라이언트 모듈을 로드하지 않습니다.

시스템의 각 애플리케이션 서버에 대해 애플리케이션 클래스 로더 정책을 단일 또는 다중으로 설정할 수 있습니다. 애플리케이션 클래스 로더 정책이 단일로 설정되면 단일 애플리케이션 클래스 로더가 시스템의 모든 EJB 모듈, 종속성 JAR 파일 및 공유 라이브러리를 로드합니다. 애플리케이션 클래스 로더 정책이 다중으로 설정되면 각 애플리케이션은 해당 애플리케이션의 EJB 모듈, 종속성 JAR 파일 및 공유 라이브러리를 로드하는 데 사용되는 자체 클래스 로더를 수신합니다.

애플리케이션의 WAR 클래스 로더 정책이 애플리케이션으로 설정된 경우, 애플리케이션 클래스 로더는 웹 모듈에서 클래스를 로드합니다. 애플리케이션의 WAR 클래스 로더 정책이 모듈로 설정되면 각 WAR 모듈은 자체 클래스 로더를 수신합니다.

다음 예제는 애플리케이션 클래스 로더 정책이 단일로 설정될 때 단일 애플리케이션 클래스 로더가 서버의 모든 애플리케이션의 모든 EJB 모듈, 종속성 JAR 파일 및 공유 라이브러리를 로드합니다. 애플리케이션이 WAR 클래스 로더 정책을 애플리케이션으로 설정한 경우, 단일 애플리케이션 클래스 로더는 웹 모듈을 로드할 수도 있습니다. WAR 클래스 로더 정책을 모듈로 설정한 애플리케이션은 웹 모듈에 대해 별도의 클래스 로더를 사용합니다.

Server's application class-loader policy: Single
Application's WAR class-loader policy: Module

Application 1
		Module: 	EJB1.jar
		Module:	WAR1.war   
	 		 	MANIFEST Class-Path: Dependency1.jar
				WAR Classloader Policy = Module
Application 2  
		Module:  	EJB2.jar
				MANIFEST Class-Path: Dependency2.jar
		Module:	WAR2.war
				WAR Classloader Policy = Application
단일 클래스 로더 정책

다음 예에서는 애플리케이션 서버의 애플리케이션 클래스 로더 정책이 Multiple로 설정될 때 서버의 각 애플리케이션이 자체 클래스 로더를 포함하는 것을 나타냅니다. 애플리케이션의 WAR 클래스 로더 정책이 Application으로 설정된 경우에도 애플리케이션 클래스 로더는 자체 웹 모듈을 로드합니다. 정책이 Module로 설정되면 웹 모듈은 자체 클래스 로더를 사용합니다.

Server's application class-loader policy: Multiple
Application's WAR class-loader policy: Module

Application 1
		Module: 	EJB1.jar
		Module:	WAR1.war   
			 	MANIFEST Class-Path: Dependency1.jar
				WAR Classloader Policy = Module
Application 2  
		Module:  	EJB2.jar
				MANIFEST Class-Path: Dependency2.jar
		Module:	WAR2.war
				WAR Classloader Policy = Application
MULTIPLE 클래스 로더 정책

클래스 로더 모드

클래스 로더 위임 모드는 클래스 로더 순서라고도 하며, 클래스 로드가 클래스 로딩을 상위 클래스 로더로 위임하는지 여부를 결정합니다. 클래스 로더 모드의 다음 값은 다음과 같이 지원됩니다.

표 2. 클래스 로더 모드 설명. 사용 가능한 모드에는 상위 먼저 및 상위 마지막이 포함됩니다.
클래스 로더 모드 설명
상위 우선

상위 클래스 로더를 사용하여 로드된 클래스 먼저라고도 합니다.

상위 먼저는 클래스를 자체 로컬 클래스 경로로부터 로드하기 전에 클래스 로더가 클래스의 로딩을 자체 상위 클래스 로더에 전달하도록 합니다. 이것은 클래스 로더 정책 및 표준 JVM 클래스 로더의 기본값입니다.
상위 나중

로컬 클래스 로더를 사용하여 로드된 클래스 먼저 또는 애플리케이션 먼저라고도 합니다.

상위 마지막은 클래스 로더가 클래스 로딩을 상위로 위임하기 전에 로컬 클래스 경로에서 클래스를 로드하게 합니다. 이 정책을 사용하여 애플리케이션 클래스 로더가 상위 클래스 로더에 있는 자체 클래스 버전을 대체하고 제공할 수 있습니다.

다음 설정은 클래스 로더의 모드를 판별합니다.

  • 애플리케이션 서버의 애플리케이션 클래스 로더 정책이 단일인 경우에는 서버 레벨 모드 값이 애플리케이션 클래스 로더의 모드를 정의합니다.
  • 애플리케이션 서버의 애플리케이션 클래스 로더 정책이 다중인 경우에는 애플리케이션 레벨 모드 값이 애플리케이션 클래스 로더의 모드를 정의합니다.
  • 애플리케이션의 WAR 클래스 로더 정책이 모듈인 경우에는 모듈 레벨 모드 값이 WAR 클래스 로더의 모드를 정의합니다.

OSGi 클래스 로더 모델

OSGi는 클래스 로더 모드로서 Manifest 파일에서 메타데이타를 사용합니다. OSGi에는 글로벌 클래스 경로가 없습니다. 번들이 OSGi 프레임워크에 설치되면, 모듈 계층이 이들의 메타데이타를 처리하고 선언된 외부 종속 항목은 기타 설치된 모듈에서 선언된 버전 지정된 내보내기에 맞추어 조정됩니다. OSGi 프레임워크는 모든 종속 항목에 대해 작업하고, 각 번들의 독립적인 필수 클래스 경로를 계산합니다. 이 접근법은 다음과 같은 요구사항이 충족되었는지 확인함으로써 일반 Java 클래스 로딩의 결점을 해결합니다:
  • 각 번들은 확실하게 내보내는 Java 패키지에 가시성만 제공합니다.
  • 각 번들은 패키지 종속 항목을 명시적으로 선언합니다.
  • 패키지는 특정 버전으로 내보내지고, 특정 버전 또는 특정 범위의 버전에서 가져올 수 있습니다.
  • 패키지의 여러 버전을 서로 다른 클라이언트에서 동시에 사용할 수 있습니다.

OSGi에 대한 자세한 정보는 OSGi 프레임워크 주제를 참조하십시오.


주제 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=crun_classload
파일 이름:crun_classload.html