사용자 정의 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍의 UDP 서버 및 클라이언트 프로그램서버: 클라이언트: UDP: 클라이언트를 열어 데이터를 받을 때까지 기다린 다음 서버를 열어 데이터를 보냅니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.