2014-11-14 18 views
6

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 urijar: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?

+1

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

+1

Von Java-Quellcode (java.net.JarURLConnection) ist die Antwort auch nein: 'int separator = spec.indexOf ("!/"); /* * REMIND: Wir behandeln keine geschachtelten JAR URLs */ ... ' –

Antwort

0

Wie in Jonas Berlin Kommentar oben gesagt, ist die Antwort keine. Von der java.net.JarURLConnection source:

/* get the specs for a given url out of the cache, and compute and 
* cache them if they're not there. 
*/ 
private void parseSpecs(URL url) throws MalformedURLException { 
    String spec = url.getFile(); 

    int separator = spec.indexOf("!/"); 
    /* 
    * REMIND: we don't handle nested JAR URLs 
    */ 
    if (separator == -1) { 
     throw new MalformedURLException("no !/ found in url spec:" + spec); 
    } 

    jarFileURL = new URL(spec.substring(0, separator++)); 
    entryName = null; 

    /* if ! is the last letter of the innerURL, entryName is null */ 
    if (++separator != spec.length()) { 
     entryName = spec.substring(separator, spec.length()); 
     entryName = ParseUtil.decode (entryName); 
    } 
}