개인 저장용 블로그

[weblogic] classloader order 본문

Oracle Fusion Middleware/WebLogic

[weblogic] classloader order

우엉잇 2022. 7. 8. 17:34

WebLogic 기동 시 WebLogic에서 Classloader order 는 아래와 같다. 

 

os -> jvm -> WLS -> app 

 

weblogic application 배포 시 app의 lib을 loader 하지 않고 wls 에 있는 lib을 먼저 loader 하여 app의 다른 lib와의 호환성 문제로 배포가 실패 되는 경우가 종종 있다. 

 

weblogic version이 낮은 경우 weblogic.xml 에서 아래와 같은 방식으로 설정을 변경해주면 된다. 

.
<container-descriptor>
 <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
.

해당 옵션은 classloader 순서를 다음과 같이 변경해준다. 

os -> jvm -> app -> WLS 

 

참고)

prefer-web-inf-classes  설정한 경우 

java*, javax*, java.xml*, weblogic*의 class 파일이 일관되게 사용되지 않을 수 있다. 

 

 

weblogic version이 최신 일 경우 weblogic.xml 에서 아래와 같은 방식으로 설정을 변경해주면 된다. 

 

(예시, 아래 설명 참고해야함)

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
  <container-descriptor>
    <prefer-web-inf-classes>false</prefer-web-inf-classes>
    <prefer-application-packages>
      <package-name>javax.faces.*</package-name>
      <package-name>com.sun.faces.*</package-name>
      <package-name>com.bea.faces.*</package-name>
    </prefer-application-packages>
 
    <prefer-application-resources>
      <resource-name>javax.faces.*</resource-name>
      <resource-name>com.sun.faces.*</resource-name>
      <resource-name>com.bea.faces.*</resource-name>
      <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
      </prefer-application-resources>
  </container-descriptor>
</weblogic-web-app>

 

prefer-application-packages 및 prefer-application-resources 사용 시 조건이 필요하다. 

 

1. prefer-web-inf-classes 설정 값이 "false" 이어야 한다. 

 

 

# prefer-application-packages 은 항상 애플리케이션에서 로드해야 하는 클래스의 패키지 목록을 지정한다. 

 

특정 packages에 대해 classloader order 순서는 os -> jvm -> app -> wls 이다. 

 

# prefer-applicatoin-resources 은 리소스가 시스템 클래스 로더에 있는 경우에도 애플리케이션에서 항상 로드되어야 하는 리소스 목록을 지정하는 옵션으로 path을 이용해 지정하려는 resources를 선택 할 수 있다. 

 

특정 class에 대해 classloader order를 app -> os -> jvm -> wls 이다.