Es ist möglich, wenn auch vielleicht schlecht beraten, Archivformate zu lesen, die .zip Dateien grundsätzlich umbenannt werden (.ear, .war, .jar, etc.), durch die jar:
URI scheme verwenden.Gibt es gültige java.net.URIs für verschachtelte Archive?
Zum Beispiel funktioniert der folgende Code gut, wenn die Variable uri
zu einem einzigen Archiv der obersten Ebene, z. wenn uri
jar:file:///Users/justingarrick/Desktop/test/my_war.war!/
private FileSystem createZipFileSystem(Path path) throws IOException {
URI uri = URI.create("jar:" + path.toUri().toString());
FileSystem fs;
try {
fs = FileSystems.getFileSystem(uri);
} catch (FileSystemNotFoundException e) {
fs = FileSystems.newFileSystem(uri, new HashMap<>());
}
return fs;
}
jedoch gleich versagen die getFileSystem
und newFileSystem
Anrufe mit einem IllegalArgumentException
, wenn die URI verschachtelte Archive enthält, z.B. wenn uri
gleich jar:jar:file:///Users/justingarrick/Desktop/test/my_war.war!/some_jar.jar!/
ist (ein .jar innerhalb eines .war).
Gibt es ein gültiges java.net.URI
Schema für verschachtelte Archivdateien?
Aus dem Speicher würde ich sagen, die Antwort ist nein. Java hat immer noch nicht behobene Fehler beim Umgehen von '!' In URIs (versuche, den Knall an das Ende eines Verzeichnisnamens zu setzen und dann zu deinem Klassenpfad hinzuzufügen), so dass meine Reaktion darauf hindeutet, dass du etwas zu erledigen hast damit es so funktioniert, wie du es willst. – ngreen
Von Java-Quellcode (java.net.JarURLConnection) ist die Antwort auch nein: 'int separator = spec.indexOf ("!/"); /* * REMIND: Wir behandeln keine geschachtelten JAR URLs */ ... ' –