런타임 자원은 역 호환 방식으로 처리됩니다. 예 : 과거에
URL url = Object.class.getResource("Object.class");
System.out.println(url);
을했을 때, 당신은 일반적으로 당신에게 대신
jrt:/java.base/java/lang/Object.class
을 줄 것이다 자바 (9)에서 같은 실행
jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class
같은 것을 얻었다. 두 경우 모두 FileSystem
을 열어 다른 사용 가능한 자원 (Java 7부터)을 검사 할 수 있습니다.
private static void readMyOwnJRE() throws IOException {
try {
Path p = Paths.get(URI.create("jrt:/modules"));
System.out.println("My own JRE's modules:");
Files.list(p).forEach(System.out::println);
System.out.println();
} catch(FileSystemNotFoundException ex) {
System.out.println("Could not read my modules (perhaps not Java 9?).");
}
}
당신이 검사 할 아닌 다른 JRE에서 실행하는 경우, 당신은을로드해야 다음 ZipFileSystem
가 FileSystems.newFileSystem
첫째, 자바 (9)의 파일 시스템을 통해 생성했다 동안 이미도 사용하기에 열려 적절한 파일 시스템 구현은 수동으로 첫째, 그러나 이것은 심지어 자바 8 JRE에서 자바 (9) 설치를 검사 할 수있는 가능성을 열어 :
public static void readOtherJRE(Path pathToJRE) throws IOException {
Path p = pathToJRE.resolve("lib").resolve("jrt-fs.jar");
if(Files.exists(p)) {
try(URLClassLoader loader = new URLClassLoader(new URL[]{ p.toUri().toURL() });
FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"),
Collections.emptyMap(),
loader)) {
System.out.println("Modules of "+pathToJRE);
Files.list(fs.getPath("/modules")).forEach(System.out::println);
System.out.println();
}
}
}
당신이 파일 시스템 (또는으로 Path
)가되면, y를 모든 표준 기능을 사용할 수 있습니다. Files
을 사용하면 데이터를 검사하거나 추출/복사 할 수 있지만 런타임 이미지의 표현이 클래스 파일 일 필요가 없으므로 올바른 용어는 다른 파일 시스템에 "동등한 클래스 파일을 저장하는"것입니다.
'jimage'에 대한 링크와 그 사용법이 유용 할 것입니다. – nullpointer
jimage에 대한 문서 페이지가 없지만'jimage --help'에 충분해야합니다. 이 도구는 문제 해결/지원 용도로 포함되어 있지만 대부분의 개발자가 필요로하는 것은 아닙니다. –
나를 위해 일했습니다. 그냥'$ jimage 추출물 $ JAVA_HOME/lib/modules'과 멍청한 짓! – 0xbe5077ed