Tomcat 클래스 로드

12467 단어 웹 서버
다음으로 이동:http://www.tuicool.com/articles/NrI7NrN
http://www.tuicool.com/articles/eQBJfyn  
1. 시작 과정
운영 체제 든 응용 프로그램 이 든 무 에서 유 를 창조 하고 순서에 따라 점진 적 인 시작 과정 이 있어 야 한다.Tomcat 도 예외 가 아니 라 모든 것 을 처음부터 시작한다.다른 애플 리 케 이 션 을 삽입 하고 코드 를 통 해 새 버 전의 Tomcat 에서 시작 하 는 것 도 지원 되 지만 본 고 는 가장 흔히 볼 수 있 는 명령 행 시작 을 예 로 들 어 소개 합 니 다.
Tomcat 압축 패 키 지 를 열 었 습 니 다. startup. sh 스 크 립 트 와 Windows 환경 을 지원 하기 위 한. bat 파일 이 있 습 니 다. Tomcat 가 시작 하 는 오 의 는 바로 여기에 있 습 니 다.startup. sh 에 한 마디 가 있 습 니 다.
exec "$PRGDIR"/"$EXECUTABLE" start "$@"

그 중 $EXECUTABLE 는 위 에 값 을 부여 한 catalina. sh 입 니 다. 즉, catalina. sh 를 실행 할 것 입 니 다. 그리고 그 다음 인 자 는 start 입 니 다. catalina. sh 라 는 스 크 립 트 를 계속 보 겠 습 니 다. 그 안에 열 린 단락 이 있 습 니 다.
elif [ "$1" = "start" ] ; then

최종 실행 문 구 는:
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

그리고 $RUnJAVA 는 시스템 환경 에서 자바 입 니 다. 중간 인 자 를 무시 하고 시작 하 는 자바 류 는 org. apache. catalina. startup. bootstrap 입 니 다.
_RUNJAVA="$JRE_HOME"/bin/java

이 org. apache. catalina. startup. bootstrap 류 에는 main 방법 이 있 습 니 다. 이것 은 우리 가 간단하게 직접 쓴 Hello World 류 컴 파일 실행 원리 와 같 습 니 다.
여기 서 우 리 는 어떤 시스템 의 소스 코드 를 읽 을 때 하나의 입구 가 있 고 입 구 를 파악 하면 모든 것 을 파악 할 수 있다 는 결론 을 내 릴 수 있다.자바 로 실행 되 는 모든 애플 리 케 이 션 은 결국 하나의 Public class 와 main 이 있 습 니 다. 이것 은 절대적 인 것 입 니 다. servlet 개발 은 관심 을 가지 지 않 고 API 프로 그래 밍 만 하면 되 지만 그래도 servlet 의 container 를 통 해 이 점 을 만족 시 킬 수 있 습 니 다.
바로 이렇다. 톰 캣 이 시동 을 걸 었 다.
2. Bootstrap 클래스
위 문서 에 org. apache. catalina. startup. bootstrap 라 고 했 어 요. 의 main 방법 이 실행 되 었 습 니 다.대응 하 는 tomcat 소스 코드 를 찾 으 면 정적 대상 daemon 의 생 성과 초기 화, 명령 행 매개 변수 에 따라 daemon 을 호출 하 는 방법 을 볼 수 있 습 니 다.
첫 번 째 블록 을 보 세 요. daemon 의 성명 을 보면 Bootstrap 의 대상 임 을 알 수 있 습 니 다. null 일 때 새로 만 들 고 init () 방법 을 실행 하여 초기 화 한 후에 daemon 에 값 을 부여 해 야 합 니 다.우 리 는 Bootstrap 의 이 init () 방법 이 도대체 어떤 일 을 했 는 지 좀 더 살 펴 보 자.
public void init()
        throws Exception
    {
        // Set Catalina path
        setCatalinaHome();
        setCatalinaBase();
        initClassLoaders();
        Thread.currentThread().setContextClassLoader(catalinaLoader);
        SecurityClassLoad.securityClassLoad(catalinaLoader);

        // Load our startup class and call its process() method
        if (log.isDebugEnabled())
            log.debug("Loading startup class");
        Class<?> startupClass =
            catalinaLoader.loadClass
            ("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.newInstance();

        // Set the shared extensions class loader
        if (log.isDebugEnabled())
            log.debug("Setting startup class properties");
        String methodName = "setParentClassLoader";
        Class<?> paramTypes[] = new Class[1];
        paramTypes[0] = Class.forName("java.lang.ClassLoader");
        Object paramValues[] = new Object[1];
        paramValues[0] = sharedLoader;
        Method method =
            startupInstance.getClass().getMethod(methodName, paramTypes);
        method.invoke(startupInstance, paramValues);

        catalinaDaemon = startupInstance;
    }

이 방법 은 두 부분 으로 나 눌 수 있다.
앞의 5 개의 문 구 는 catalina 류 로 더 와 관련 된 환경 변 수 를 초기 화 한 다음 에 각 종류의 로 더 대상 을 초기 화 합 니 다. comonLoader, shared Loader 를 포함 합 니 다. 그 중에서 가장 중요 한 것 은 catalinaLoader 입 니 다. 이 를 Bootstrap 의 속성 값 으로 설정 합 니 다
여섯 번 째 문장 부터 앞 에 구 성 된 catalinaLoader 를 사용 하여 tomcat 의 가장 핵심 적 인 대상 을 불 러 옵 니 다. 바로 org. apache. catalina. startup. Catalina 류 의 대상 catalinaDaemon 을 사용 하고 반사 적 인 방식 으로 setParentClassLoader 방법 을 호출 하여 shared Loader 를 매개 변수 로 전달 합 니 다
이 과정 에서 Bootstrap 류 가 가지 고 있 는 몇 개의 대상 (정적 daemon, 비 정적 catalinaDaemon, comonLoader, shared Loader, catalinaLoader) 이 생 성 되 고 필요 한 초기 화 되 었 음 을 알 수 있 습 니 다.
그럼 다음은 메 인 방법의 후반 부 를 살 펴 보 겠 습 니 다.예 를 들 어 방금 시 작 했 을 때 우리 가 받 은 명령 행 인 자 는 start 입 니 다. 그러면 다음 코드 를 실행 합 니 다.
else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
            }

Bootstrap 류 의 daemon 대상 의 setAwait (), load (), start () 세 가지 방법 을 각각 호출 합 니 다.이 세 가지 방법 은 우리 가 약간 깊이 들 어가 보 니 Bootstrap 의 방법 에서 Catalina 방법 까지 의 호출 이 고 중간 에 모두 반사 방식 을 사용 한 것 을 발견 했다.이 세 가지 방법 이 최종 적 으로 무엇 을 했 는 지 에 대해 우 리 는 먼저 자세히 말 하지 않 고 나중에 블록 을 나 누 어 상세 하 게 정리 할 것 이다. 그러나 그 중에서 간단하게 알 수 있다.
setAwait () 는 Catalina 대상 의 속성 값 을 설정 한 것 으로 서버 가 시 작 된 후 실행 상 태 를 유지 하고 특정 포트 를 열 어 후속 으로 보 내 는 명령 을 감청 하 며 SHUTDOWN 명령 을 받 을 때 까지 서버 를 닫 는 역할 을 합 니 다
load () 는 로드 와 초기 화 입 니 다.전체 Tomcat 서버 와 관련 된 프로필 을 불 러 오고 분석 하 며 Tomcat 의 각 구성 요 소 를 초기 화 합 니 다
start (), 이 건 말 할 것 도 없 이 카 탈리 나 를 본 격 적 으로 시작 하거나 Tomcat 서버 의 핵심 작업 을 시작 한 것 입 니 다
이 를 예 로 들 어 Bootstrap 의 다른 명령, 예 를 들 어 stop 등 은 본 고 는 상세 하 게 서술 하고 싶 지 않 습 니 다. 관심 이 있 는 사람 은 이 방법 에 따라 소스 코드 를 볼 수 있 습 니 다.
3. Tomcat 클래스 로 딩
다른 주류 의 자바 웹 서버 와 마찬가지 로 Tomcat 도 서로 다른 사용자 정의 클래스 로 더 를 가지 고 각종 자원 라 이브 러 리 에 대한 통 제 를 실현 합 니 다.일반적으로 자바 웹 서버 는 다음 과 같은 네 가지 문 제 를 해결 해 야 한다.
①   같은 웹 서버 에 서 는 각 웹 프로젝트 간 에 각각 사용 되 는 자바 라 이브 러 리 가 서로 격 리 되 어야 합 니 다.
②   같은 웹 서버 에 서 는 각 웹 프로젝트 간 에 공 유 된 자바 라 이브 러 리 를 제공 할 수 있 습 니 다.
③   서버 는 웹 프로젝트 의 영향 을 받 지 않 기 위해 서버 의 라 이브 러 리 와 응용 프로그램의 라 이브 러 리 를 서로 독립 시 켜 야 합 니 다.
④   JSP 를 지원 하 는 웹 서버 에 대해 서 는 핫 플러그 (hotswap) 기능 을 지원 해 야 합 니 다.
상기 몇 가지 문제 에 대해 하나의 클래스 로 더 를 단독으로 사용 하면 분명히 효과 가 없 으 므 로 실제 에 따라 몇 개의 사용자 정의 클래스 로 더 를 사용 해 야 한다.
다음은 이 책 에서 주로 분석 한 Tomcat 7 을 예 로 들 어 클래스 로 더 가 어떻게 정의 되 는 지 살 펴 보 겠 습 니 다.그림 2 - 4 - 3 과 같이 클래스 로 더, 확장 클래스 로 더, 응용 프로그램 클래스 로 더 등 세 가지 종류의 로 더 데이터 JDK 급 로 더 를 시작 합 니 다. 그들 은 유일한 것 입 니 다. 우 리 는 일반적으로 변경 하지 않 습 니 다.다음은 Tomcat 의 클래스 로 더 입 니 다. tomcat 7 에서 가장 중요 한 클래스 로 더 는 Common ClassLoader 입 니 다. 부모 클래스 로 더 는 ApplicationClassLoader 로 $CATALINA 를 불 러 옵 니 다.BASE/lib、  $CATALINA_HOME / lib 두 디 렉 터 리 에 있 는 모든. class 와. jar 파일.다음 점선 상자 의 두 가지 종류의 로 더 는 Tomcat 5 버 전에 서 이 두 종류의 로 더 인 스 턴 스 는 기본적으로 Common ClassLoader 인 스 턴 스 와 다 르 며, Common ClassLoader 는 부모 클래스 로 더 를 추가 합 니 다.한편, Tomcat 7 에 서 는 이 두 개의 인 스 턴 스 변수 도 존재 합 니 다. catalina. properties 설정 파일 이 server. loader 와 share. loader 두 항목 을 설정 하지 않 았 기 때문에 프로그램 에서 이 두 가지 인 스 턴 스 는 CommonClassLoader 인 스 턴 스 로 할당 되 었 습 니 다. 즉, tomcat 인 스 턴 스 는 CommonClassLoader 인 스 턴 스 만 있 습 니 다.다음 코드 와 같이
private void initClassLoaders() {
try {
commonLoader = createClassLoader( "common" , null );
if ( commonLoader == null ) {
commonLoader = this .getClass().getClassLoader();
}
catalinaLoader = createClassLoader( "server" , commonLoader );
sharedLoader = createClassLoader( "shared" , commonLoader );
} catch (Throwable t) {
handleThrowable (t);
log .error( "Class loader creation threwexception" , t);
System. exit (1);
}
}
먼저 comonLoader 를 만 들 고 comonLoader 를 매개 변수 로 createClassLoader 방법 에 전달 합 니 다. 이 방법 에 서 는 catalina. properties 의 server. loader 와 share. loader 속성 이 비어 있 는 지 에 따라 새로운 클래스 로 더 를 만 들 지 여 부 를 판단 합 니 다. 만약 속성 이 비어 있 으 면 comonLoader 를 catalina Loader 와 shared Loader 에 직접 할당 합 니 다. 기본 값 으로 설정 하면원 하 는 것 을 만족 시 키 지 못 하면 catalina. properties 설정 파일 을 수정 하여 원 하 는 것 을 만족 시 킬 수 있 습 니 다. WebAppClassLoader 는 이름 을 보면 웹 프로그램 을 불 러 오 는 데 주로 사용 되 는 것 을 알 수 있 습 니 다. 부모 클래스 로 더 는 Common ClassLoader 입 니 다. 보통 여러 개의 WebApp 클래스 로 더 인 스 턴 스 가 있 습 니 다. 각 종류의 로 더 는 웹 프로그램 을 불 러 옵 니 다. 로 딩 경 로 는 / WebApp / WEB - INF 디 렉 터 리 입 니 다.마지막 으로 JSP ClassLoader 는 jsp 파일 을 불 러 오 는 class 입 니 다. WebApp ClassLoader 는 부모 클래스 로 더 를 불 러 옵 니 다. Tomcat 에서 jsp 파일 이 변경 되 었 음 을 감지 하면 새로운 JSP ClassLoader 를 만 들 고 현재 JSP ClassLassLoader 를 교체 하여 / WebApp / WEB - INF 디 렉 터 리 에 있 는 JSP 를 불 러 옵 니 다.
그림 2 - 4 - 3 Tomcat 7 류 캐리어
이러한 종류의 로 더 구 조 를 대조 하여 위의 자바 웹 서버 가 해결 해 야 할 문제 가 해결 되 었 는 지 확인 하 십시오. 모든 웹 애플 리 케 이 션 은 자신의 WebApp ClassLoader 가 있 기 때문에 여러 웹 애플 리 케 이 션 간 에 서로 격 리 시 키 고 Tomcat 가 웹 애플 리 케 이 션 의 영향 을 받 지 않도록 효과적으로 할 수 있 습 니 다. Common ClassLoader 의 존 재 는 여러 웹 애플 리 케 이 션 이 서로 공유 할 수 있 도록 합 니 다.클래스 라 이브 러 리; 모든 JSP 파일 이 하나의 JSp ClassLoader 에 대응 하면 Tomcat 에서 열 교체 기능 을 지원 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기