6장. JBoss EAP 클래스 로드
JBoss EAP는 모듈식 클래스 로드 시스템을 사용하여 배포된 애플리케이션의 클래스 경로를 제어합니다. 이 시스템은 기존의 계층형 클래스 로더 시스템보다 더 높은 유연성과 제어력을 제공합니다. 개발자는 애플리케이션에 사용할 수 있는 클래스를 세부적으로 제어할 수 있으며, 자체 애플리케이션에 대해 애플리케이션 서버에서 제공하는 클래스를 무시하도록 배포를 구성할 수 있습니다.
모듈식 클래스 로더는 모든 Java 클래스를 모듈이라는 논리 그룹으로 분리합니다. 각 모듈은 해당 모듈의 클래스를 자체 클래스 경로에 추가하기 위해 다른 모듈에 대한 종속성을 정의할 수 있습니다. 배포된 각 JAR 및 WAR 파일은 모듈로 처리되므로 개발자는 모듈 구성을 애플리케이션에 추가하여 애플리케이션 클래스 경로의 콘텐츠를 제어할 수 있습니다.
6.1. module 링크 복사링크가 클립보드에 복사되었습니다!
모듈은 클래스 로드 및 종속성 관리에 사용되는 클래스의 논리적 그룹화입니다. JBoss EAP는 정적 및 동적 두 가지 유형의 모듈을 식별합니다. 이 둘의 주요 차이점은 패키지 방식입니다.
정적 모듈
정적 모듈은 애플리케이션 서버의 EAP_HOME/modules/ 디렉터리에 정의됩니다. 각 모듈은 하위 디렉터리로 존재합니다(예: EAP_HOME/modules/com/mysql/ ). 각 모듈 디렉터리에는 main을 기본값으로 하고 module.xml 구성 파일과 필요한 JAR 파일이 포함된 슬롯 하위 디렉터리가 포함됩니다. 모든 애플리케이션 서버 제공 API는 자카르타 EE API 및 기타 API를 포함하여 정적 모듈로 제공됩니다.
예제: MySQL JDBC(Java Database Connectivity) Driver module.xml 파일
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-8.0.12.jar"/>
</resources>
<dependencies>
<module name="javaee.api"/>
<module name="sun.jdk"/>
<module name="ibm.jdk"/>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
모듈 이름 com.mysql 은 슬롯 이름 main 을 제외하고 모듈의 디렉터리 구조와 일치해야 합니다.
사용자 지정 정적 모듈 생성은 동일한 타사 라이브러리를 사용하는 동일한 서버에 많은 애플리케이션을 배포하는 경우 유용할 수 있습니다. 각 애플리케이션과 함께 이러한 라이브러리를 결합하는 대신, 이러한 라이브러리를 포함하는 모듈을 관리자가 생성하고 설치할 수 있습니다. 그러면 애플리케이션이 사용자 지정 정적 모듈에 명시적 종속성을 선언할 수 있습니다.
JBoss EAP 배포에 제공되는 모듈은 EAP_HOME/modules 디렉터리 내의 시스템 디렉터리에 있습니다. 따라서 타사가 제공하는 모든 모듈과 분리됩니다. 모든 Red Hat은 JBoss EAP 상단에 계층화된 제품을 제공했습니다. 또한 시스템 디렉토리 내에 모듈을 설치합니다.
사용자는 사용자 지정 모듈이 모듈당 하나의 디렉터리를 사용하여 EAP_HOME/modules 디렉터리에 설치되어 있는지 확인해야 합니다. 이렇게 하면 시스템 디렉터리에 이미 존재하는 모듈의 사용자 지정 버전이 제공된 버전 대신 로드됩니다. 이러한 방식으로 사용자 제공 모듈이 시스템 모듈보다 우선합니다.
JBOSS_MODULEPATH 환경 변수를 사용하여 JBoss EAP에서 모듈을 검색하는 위치를 변경하는 경우 이 제품은 지정된 위치 중 하나 내에서 시스템 하위 디렉터리 구조를 찾습니다. 시스템 구조는 JBOSS_MODULEPATH 로 지정된 위치에 있어야 합니다.
JBoss EAP 7.1부터는 module.xml 파일의 resource-root 경로 요소에서 절대 경로 사용도 지원됩니다. 이렇게 하면 리소스 라이브러리를 EAP_HOME/modules 디렉터리로 이동할 필요 없이 액세스할 수 있습니다.
예제: module.xml 파일의 절대 경로
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="oracle.jdbc">
<resources>
<resource-root path="/home/redhat/test.jar"/>
</resources>
</module>
동적 모듈
동적 모듈은 각 JAR 또는 WAR 배포 또는 EAR의 각 하위 배포에 대해 애플리케이션 서버에서 생성 및 로드됩니다. 동적 모듈의 이름은 배포된 아카이브의 이름에서 파생됩니다. 배포는 모듈로 로드되므로 종속성을 구성하고 다른 배포에서 종속성으로 사용할 수 있습니다.
모듈은 필요한 경우에만 로드됩니다. 이는 일반적으로 명시적 또는 암시적 종속성이 있는 애플리케이션이 배포되는 경우에만 발생합니다.
사전 정의된 모듈
JBoss EAP 7.2부터 기본 모듈 로더를 사용할 때 사전 정의된 모듈 세트를 사용할 수 있습니다. 모든 JBoss 모듈 API를 포함하는 특수 모듈인 org.jboss.modules 는 항상 사용할 수 있으며 JBoss 모듈에서 제공합니다. Java 9 이상에서 제공되는 표준 JMS(Java Platform Module System) 모듈은 표준 이름으로도 사용할 수 있습니다. JDK 8을 사용하는 경우 JBoss 모듈에서 JDK 9 모듈을 에뮬레이션합니다.
Java 9 이상에서 사용 가능한 플랫폼 모듈 목록은 해당 JDK 설명서를 참조하십시오.
Java 8에 제공된 플랫폼 모듈 목록을 보려면 Java 8 에 제공되는 플랫폼 모듈을 참조하십시오.