사용자 정의 ClassLoader,jar 패키지에서 jar 패키지 구성 파일 문제를 로드할 수 없습니다.

2779 단어 java 기초

사용자 정의 ClassLoader 학우를 쓸 줄 알고 당신도 ClassLoader에 대해 어느 정도 알고 있을 거라고 믿습니다.아니면 너도 나를 도와 의혹을 풀 수 있어...... 
URLClassLoader는 외부jar 패키지를 불러오는 데 주로 사용되며, 보통 URLClassLoader를 통해 추가jar 패키지를 불러와서 충돌 문제를 해결합니다.
그런데 테스트 중에 이상이 하나 생겼어요.
Illegal Hadoop Version: Unknown (expected A.B.* format)

Jar에서 Hadoop 구성 요소를 사용하지만,hadoop에서classpath 아래의common-version-info를 읽을 수 없습니다.properties 구성 파일입니다.
Hadoop의 원본 코드를 대충 읽었습니다.
protected VersionInfo(String component) {
    info = new Properties();
    String versionInfoFile = component + "-version-info.properties";
    InputStream is = null;
    try {
      is = Thread.currentThread().getContextClassLoader()
        .getResourceAsStream(versionInfoFile);
      if (is == null) {
        throw new IOException("Resource not found");
      }
      info.load(is);
    } catch (IOException ex) {
      LogFactory.getLog(getClass()).warn("Could not read '" +
          versionInfoFile + "', " + ex.toString(), ex);
    } finally {
      IOUtils.closeStream(is);
    }
  }

소스 검색:
Thread.currentThread().getContextClassLoader() .getResourceAsStream(versionInfoFile);

읽은 구성입니다.
그래서 저는 사용자 정의 ClassLoader에서 현재 ClassLoader를 스레드의 ClassLoader에 넣었습니다. 코드는 다음과 같습니다.
ClassLoader classLoader = new URLClassLoader(new URL[]{new URL(url)}, Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(classLoader);

다시 테스트, 테스트 통과~
===========================================================================
다음과 같은 몇 가지 질문이 있습니다.
1.Thread.currentThread().getContextClassLoader() .get Resource As Stream 방식은jar 패키지의 설정을 불러오지 않습니다. 호출자의 라인에ClassLoader를 추가한 후에 이런 방식으로 불러올 수 있습니까?
솔직히 잘 모르겠어요. 부모님이 위임하셔서 URLClass Loader A를 사용자 정의하고 jar 패키지를 불러오려면 jar 패키지 내class의 부류 캐리어는 A가 되어야 한다는 걸 다들 알고 있어요. 그런데 제가 테스트를 했는데 A를 현재 라인의 클래스 캐리어에 넣지 않으면 jar 패키지 내의 클래스 캐리어는 AppClass Loader이고 설정을 불러오지 않아요. 만약에 A를 현재 라인의 클래스 캐리어에 넣으면jar 패키지의 클래스 로더는 URLclassLoader이며 설정에 불러올 수 있습니다 ~~
Thread를 사용하지 않는다면 나는 또 테스트를 해 보았다.currentThread().getContextClassLoader() .getResourceAssStream 방식으로 설정을 불러오는 대신 Classxx를 사용합니다.class.getClassLoader().Resource As Stream에서 설정을 불러옵니다. 사용자 정의 URLClass Loader A를 현재 라인의 클래스 마운트에 넣지 않습니다.jar 패키지 내의 클래스 마운트는 AppClass Loader이고 설정을 불러올 수 있습니다!!A를 현재 라인의 클래스 로더에 넣고jar 패키지의 클래스 로더는 URLClassLoader이며 설정에도 불러올 수 있습니다!!!
하나의 루틴은 사용자 정의 URLClassLoader로jar 패키지의 클래스를 불러옵니다.jar 패키지의 클래스가 불러오는 부모 클래스는 도대체 사용자 정의 URLClassLoader입니까?위의 테스트를 통해 만약에 스레드를 사용했다면 Thread를 사용했을 것이다.currentThread().setContextClassLoader(classLoader);그럼 jar 패키지에 있는 ClassLoader는 URLClassLoader가 틀림없습니다.그렇지 않으면 AppClassLoader를 사용합니다.
나의 궁금증을 풀어줄 형님 TT

좋은 웹페이지 즐겨찾기