Zasoby środowiska wykonawczego są obsługiwane w sposób kompatybilny wstecz. Na przykład. kiedy zrobiłeś
URL url = Object.class.getResource("Object.class");
System.out.println(url);
w przeszłości, zwykle coś podobnego
jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class
bieganie to samo pod Java 9 dadzą Ci
jrt:/java.base/java/lang/Object.class
zamiast. W obu przypadkach można otworzyć na nim FileSystem
, aby sprawdzić inne dostępne zasoby (od Javy 7). Choć ZipFileSystem
musiał zostać stworzony przez FileSystems.newFileSystem
pierwszy system plików Java 9.x jest nawet już otwarta do użytku:
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?).");
}
}
Jeśli działa pod inną JRE niż ten, który chcesz sprawdzić, trzeba załadować wdrożenie systemu odpowiedni plik ręcznie pierwszy, ale ta otwiera możliwość wglądu do instalacji Java 9 nawet z Java 8 JRE:
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();
}
}
}
Gdy masz system plików (lub Path
do niego), y możesz użyć wszystkich standardowych funkcji, np. Files
do sprawdzenia lub wyodrębnienia/skopiowania danych, chociaż właściwym terminem byłoby "przechowywać równoważny plik klasy" w innym systemie plików, ponieważ reprezentacja obrazu środowiska wykonawczego wcale nie musi być plikiem klasy.
wszelkie linki do 'jimage' i jak mogą być użyte również będą przydatne. – nullpointer
Nie ma strony z dokumentami dla jimage, ale 'jimage --help' powinno wystarczyć. Zauważ, że to narzędzie jest dołączone do rozwiązywania problemów/pomocy technicznej, nie jest to coś, czego większość programistów kiedykolwiek będzie potrzebować. –
Pracowałem dla mnie. Właśnie zrobiłem '$ jimage extract $ JAVA_HOME/lib/modules' i puf! – 0xbe5077ed