2015-01-14 6 views
8

Questo errore è presente nelle versioni 1.7 e 1.8 più recenti di JDK (7u72, 8u25). Richiesto: jackson-databind 2.5.0. Testato su Linux x86_64 (Ubuntu 14.10 per la precisione).Bug nel file system zip JDK di Oracle, come si scrive un SSCCE per riprodurlo?

Codice:

public static void main(final String... args) 
    throws IOException 
{ 
    final Map<String, String> map 
     = Collections.singletonMap("create", "true"); 
    final Path zipfile = Paths.get("/tmp/foo.zip"); 
    Files.deleteIfExists(zipfile); 
    final URI uri = URI.create("jar:" + zipfile.toUri()); 
    final ObjectMapper mapper = new ObjectMapper(); 

    try (
     final FileSystem zipfs = FileSystems.newFileSystem(uri, map); 
     final OutputStream out 
      = Files.newOutputStream(zipfs.getPath("/t.json")); 
    ) { 
     mapper.writeValue(out, "hello"); 
    } 
} 

Questo produce un file non valido zip:

$ unzip /tmp/foo.zip 
Archive: /tmp/foo.zip 
replace t.json? [y]es, [n]o, [A]ll, [N]one, [r]ename: A 
    inflating: t.json     
    error: invalid compressed data to inflate 

ho originariamente aperto il bug su Jackson issue tracker, anche se in realtà non è il colpevole qui, e una soluzione è stato trovato per aggirare il problema: disabilitare JsonGenerator.Feature.AUTO_CLOSE_SOURCE nel ObjectMapper. Questa opzione che è abilitata di default dice al mapper di chiudere il flusso.

Mentre mi piacerebbe aprire il bug su Oracle, vorrei prima essere in grado di scrivere un SSCCE, ma non posso. Ho provato a chiudere lo stream due volte (poiché è stato chiuso due volte nell'esempio), a non utilizzare un'istruzione try-with-resources, ecc., Ma inutilmente.

Si può venire con un SSCCE per questo problema?

+0

potrei esaminare la dimensione di ciò che è scritto la zip. E dai uno sguardo molto attento alla fonte per scoprire i possibili luoghi che potrebbero rompersi. – kdgregory

+0

Inoltre, prova a creare un decoratore 'OutputStream' che gira quando' close() 'viene chiamato due volte. – kdgregory

+1

Perché Jackson non è il cuplrit? – EJP

risposta

3

Avevo pensato che Jackson stesse facendo qualcosa di spiacevole, ma si scopre che si può riprodurre il problema senza alcun codice di Jackson. Ho sostituito il corpo del blocco try con due linee che (sono abbastanza sicuro) fare la stessa cosa, e il risultato è ancora un file zip valido:

try (
    final FileSystem zipfs = FileSystems.newFileSystem(uri, map); 
    final OutputStream out 
     = Files.newOutputStream(zipfs.getPath("/t.json")); 
) { 
    out.write("\"hello\"".getBytes(StandardCharsets.US_ASCII)); 
    out.close(); 
} 
+0

Grazie! Pubblicato su nio-dev, ora vedremo quando viene risolto ... – fge

+3

FWIW: [bug è aperto] (https://bugs.openjdk.java.net/browse/JDK-8069211). Grazie ancora per il codice di esempio! – fge

Problemi correlati