자바 설정 의 Classpath 를 쉽게 돌 립 니 다.

자바 류 경로(classpath)와 접촉 하 는 과정 에서 개발 자 들 은 가끔 어려움 을 겪 습 니 다.클래스 로 더 가 실제 불 러 온 클래스 가 어떤 클래스 인지 알 수 없 기 때 문 입 니 다.프로그램의 classpath 가 대량의 클래스 와 디 렉 터 리 를 포함 하고 있 을 때 상황 이 특히 심각 하기 때 문 입 니 다.이 글 은 클래스 파일 을 불 러 오 는 절대 경로 이름 을 보 여 주 는 도 구 를 제공 할 것 입 니 다.1.Classpath 기반 자바 가상 머 신(JVM)은 클래스 로 더 를 통 해 프로그램 에서 사용 하 는 클래스 를 불 러 오고 어떤 종 류 를 불 러 올 지 그 당시 의 수요 에 따라 결정 합 니 다.CLASSPATH 환경 변 수 는 클래스 로 더 가 제3자 가 제공 하 는 클래스 와 사용자 정의 클래스 를 찾 는 곳 을 알려 줍 니 다.또한 JVM 명령 행 인자-classpath 를 응용 프로그램 이 지정 한 클래스 경로 로 사용 할 수 있 습 니 다.-classpath 에서 지정 한 클래스 경 로 는 CLASSPATH 환경 변수 에서 지정 한 값 을 덮어 쓸 수 있 습 니 다.클래스 경로 의 내용 은 파일 의 디 렉 터 리(가방 에 없 는 클래스 포함),가방 의 루트 디 렉 터 리(포 장 된 클래스 포함),포 함 된 파일(예 를 들 어 zip 파일 이나.jar 파일 포함)일 수 있 습 니 다.유 닉 스 가족의 시스템 에서 클래스 경로 의 각 항목 은 콜론 으로 구분 되 고 MS Windows 시스템 에 서 는 분점 으로 구 분 됩 니 다.클래스 로 더 는 위탁 차원 의 형식 으로 구성 되 며,클래스 로 더 마다 부모 로 더 가 있 습 니 다.클래스 로 더 가 클래스 를 불 러 오 라 고 요 구 받 았 을 때,클래스 를 찾 으 려 고 시도 하기 전에 부모 클래스 로 더 에 요청 을 먼저 맡 깁 니 다.시스템 클래스 로 더,즉 시스템 에 설 치 된 JDK 나 JRE 가 제공 하 는 기본 클래스 로 더 입 니 다.CLASSPATH 환경 변수 나-classpath 라 는 JVM 명령 행 매개 변 수 를 통 해 제3자 가 제공 하 는 클래스 나 사용자 가 정의 하 는 클래스 를 불 러 옵 니 다.시스템 클래스 로 더 는 확장 클래스 로 더 에 자바 Extension 체 제 를 사용 하 는 클래스 를 불 러 오 라 고 의뢰 합 니 다.확장 클래스 로 더 는 자체 클래스 로 더(boottstrap class loader)에 핵심 JDK 클래스 를 불 러 오 는 것 을 의뢰 합 니 다.특수 한 클래스 로 더 를 개발 하여 JVM 이 클래스 를 어떻게 동적 으로 불 러 오 는 지 맞 출 수 있 습 니 다.예 를 들 어 대부분의 Servlet 엔진 은 맞 춤 형 클래스 로 더 를 사용 하여 classpath 가 지정 한 디 렉 터 리 에 변 화 된 클래스 를 동적 으로 불 러 옵 니 다.특히 주의해 야 할 것 은 클래스 로 더 를 불 러 오 는 순서 가 클래스 path 에 나타 나 는 순서 입 니 다.클래스 로 더 는 classpath 의 첫 번 째 항목 부터 설정 한 디 렉 터 리 와 압축 파일 을 차례대로 검사 하고 불 러 올 클래스 파일 을 찾 으 려 고 합 니 다.클래스 로 더 가 지정 한 이름 을 가 진 클래스 를 처음 찾 았 을 때 이 클래스 를 불 러 옵 니 다.classpath 에 남 은 모든 항목 이 무시 되 었 습 니 다.쉬 워 보 여요.그 렇 죠?2.문제 가 발생 할 수 있 습 니 다.그들 이 인정 하 든 말 든 초보 자 와 경험 이 풍부 한 자바 개발 자 는 똑 같 습 니 다.그들 은 가끔(보통 최 악의 상황 에서)지루 하고 복잡 한 classpath 에 속 았 습 니 다.응용 프로그램 이 의존 하 는 제3자 클래스 와 사용자 정의 클래스 의 수량 이 점점 증가 하고 classpath 도 가능 한 모든 디 렉 터 리 와 파일 이름 을 쌓 는 곳 이 되 었 습 니 다.이때,클래스 적재 기 가 가장 먼저 적재 하 는 종류 가 도대체 어떤 종류 인지 더 이상 알 수 없다.만약 classpath 에 중 복 된 클래스 입구 가 포함 되 어 있다 면,이 문 제 는 특히 두드러진다.앞에서 언급 한 바 와 같이 클래스 로 더 는 항상 첫 번 째 클래스 를 불 러 옵 니 다.클래스 로 더 는 클래스 path 에서 찾 을 수 있 는 적당 한 이름 을 가 진 클래스 를 불 러 옵 니 다.실제 효 과 를 보면,클래스 path 에서 우선 순위 가 낮은 클래스 를 숨 깁 니 다.조심 하지 않 으 면 이 classpath 의 함정 에 빠 지기 쉽다.하루 의 긴 작업 을 마 쳤 을 때 마지막 으로 프로그램 이 가장 좋 고 최신 클래스 를 사용 할 수 있 도록 하나의 디 렉 터 리 를 classpath 에 추 가 했 습 니 다.그러나 이와 동시에 classpath 의 또 다른 우선 순위 가 있 는 디 렉 터 리 에 다른 버 전 을 저장 하고 있다 는 것 을 잊 었 습 니 다!3.간단 한 classpath 도구 우선 순위 문 제 는 평면 경로 성명 방법 이 타고 난 고유 한 문제 이지 만 자바 의 classpath 만 있 는 문제 가 아 닙 니 다.이 문 제 를 해결 하려 면 전설 적 인 색 채 를 가 진 소프트웨어 블록 버스터 의 어깨 에 서 있어 야 합 니 다.유 닉 스 운영 체제 에는 which 명령 이 있 습 니 다.명령 매개 변수 에 이름 을 지정 하면 which 는 명령 으로 실 행 될 때 파일 을 실행 하 는 경로 이름 을 표시 합 니 다.실제로 which 명령 은 PATH 변 수 를 분석 한 다음 명령 이 처음 나타 난 위 치 를 찾 는 것 이다.자바 의 클래스 경로 관리 에 있어 서도 좋 은 도구 일 것 입 니 다.그것 의 계발 아래 나 는 자바 도구 JWhich 를 설계 하 는 데 착수 했다.이 도 구 는 자바 류 의 이름 을 지정 한 다음 classpath 의 안내 에 따라 클래스 로 더 가 불 러 올 클래스 가 있 는 위치의 절대 경 로 를 찾 아야 합 니 다.다음은 JWhich 의 인 스 턴 스 입 니 다.자바 클래스 로 더 가 com.clarkware.ejb.shoppingCartBean 클래스 를 불 러 올 때 이 클래스 가 처음으로 위치 에 나타 난 절대 경로 이름 을 보 여 줍 니 다.검색 결과 이 종 류 는 한 디 렉 터 리 에 있 습 니 다.>자바 JWhich com.clarkware.ejb.ShoppingCartBean Class'com.clarkware.ejb.ShoppingCartBean'found in'/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class'다음은 두 번 째 JWhich 사용 인 스 턴 스 입 니 다.자바 클래스 로 더 가 javax.servlet.http.HttpServlet 클래스 를 불 러 올 때 이 클래스 가 처음으로 위치 에 나타 난 절대 경로 이름 을 보 여 줍 니 다.검색 결과 이 클래스 가 파일 에 있 는 것 으로 나 타 났 습 니 다.>자바 JWhich javax.servlet.http.HttpServlet Class'javax.servlet.http.HttpServlet'found in'file:/home/mclark/lib/servlet.jar!/javax/servlet/http/HttpServlet.classs'4,JWhich 의 작업 과정 은 classpath 에서 어떤 종류 가 먼저 불 러 오 는 지 정확하게 측정 해 야 합 니 다.클래스 로 더 의 사고방식 에 깊이 들 어가 야 합 니 다.사실 구체 적 으로 실 현 될 때 는 이렇게 복잡 하 게 들 리 지 않 았 다.1:Public class JWhich{2:3:/*4:*현재 classpath 설정 에 따라 5:*지정 한 클래스 파일 이 있 는 6:*위 치 를 포함 하 는 절대 경 로 를 표시 합 니 다 7:*8:*@param className<클래스 의 이름>9:*/10:Public static void which(String className){11:12:if(!className.startsWith("/")) {   13: className = "/" + className;   14: }   15: className = className.replace('.', '/');   16: className = className + ".class";   17:   18: java.net.URL classUrl =   19: new JWhich().getClass().getResource(className);   20:   21: if (classUrl != null) {   22: System.out.println(" Class '" + className +   23: "' found in '" + classUrl.getFile() + "'");   24: } else {   25: System.out.println(" Class '" + className +   26: "' not found in '" +   27: System.getProperty("java.class.path") + "'");   28: }   29: }   30:   31: public static void main(String args[]) {   32: if (args.length > 0) {   33: JWhich.which(args[0]);   34: } else {   35: System.err.println("Usage: java JWhich "); 36:}37:38:}우선,클래스 로 더 가 받 아들 일 수 있 도록 클래스 이름 을 조금 조정 해 야 합 니 다(12-16 줄).클래스 이름 앞 에"/"를 추가 하면 클래스 로 더 가 classpath 의 클래스 이름 을 한 글자 씩 정확하게 일치 하도록 요구 합 니 다.호출 클래스 의 가방 이름 접 두 사 를 은연 중 에 추가 하려 는 것 이 아 닙 니 다.모든"."를"/"로 바 꾸 는 목적 은 클래스 로 더 의 요구 에 따라 클래스 이름 을 합 법 적 인 URL 자원 이름 으로 포맷 하 는 것 입 니 다.다음 프로그램 은 클래스 로 더 에 자원 을 조회 합 니 다.이 자원 의 이름 은 적당 한 포맷 을 거 친 클래스 이름과 일치 해 야 합 니 다(18-19 줄).모든 Class 대상 은 이 를 불 러 오 는 ClassLoader 대상 에 대한 인용 을 유지 하고 있 기 때문에 JWhich 클래스 를 불 러 오 는 클래스 로 더 에 문의 합 니 다.Class.getResource()방법 은 실제 클래스 로 더 를 불 러 오 는 것 을 의뢰 하고 클래스 파일 자원 을 읽 기 위 한 URL 을 되 돌려 줍 니 다.또는 지정 한 클래스 이름 이 현재 classpath 에서 찾 을 수 없 을 때 Class.getResource()방법 은 null 로 되 돌아 갑 니 다.마지막 으로 현재 classpath 에서 지정 한 클래스 를 찾 을 수 있다 면 프로그램 은 이러한 종류의 파일 이 있 는 위 치 를 포함 하 는 절대 경로 이름(21-24 줄)을 표시 합 니 다.디 버 깅 보조 수단 으로서 현재 classpath 에서 지정 한 클래스 를 찾 을 수 없다 면 프로그램 은 java.classs.path 시스템 속성 을 가 져 와 현재 classpath(24-28 줄)를 표시 합 니 다.Servlet 엔진 classpath 를 사용 하 는 자바 Servlet 이나 EJB 서버 classpath 를 사용 하 는 EJB 구성 요소 에서 이 간단 한 코드 가 어떻게 작 동 하 는 지 상상 하기 쉽다.예 를 들 어 JWhich 클래스 가 Servlet 엔진 의 맞 춤 형 로 더 로 불 러 오 면 프로그램 은 Servlet 엔진 의 클래스 로 더 로 지정 한 클래스 를 찾 습 니 다.Servlet 엔진 의 클래스 로 더 가 클래스 파일 을 찾 을 수 없다 면 부모 클래스 로 더 를 의뢰 합 니 다.일반적으로 JWhich 가 특정한 종류의 로 더 에 불 러 올 때 현재 클래스 로 더 와 모든 부모 클래스 로 더 가 불 러 온 모든 종 류 를 찾 을 수 있 습 니 다.[끝 말]모든 발명의 어머니 가 필요 하 다 면 자바 류 경 로 를 관리 하 는 데 도움 을 주 는 도구 가 오래 늦 었 다 고 할 수 있 습 니 다.자바 뉴스 팀 과 메 일 링 리스트 에는 classpath 와 관련 된 많은 문제 가 가득 합 니 다.현재 JWhich 는 우리 에 게 간단 하면 서도 강력 한 도 구 를 제공 하여 어떠한 환경 에서 도 자바 류 경 로 를 철저하게 돌 릴 수 있 도록 도와 주 었 습 니 다.

좋은 웹페이지 즐겨찾기