Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re: Archive::Zip Problem: Zip versus Jar file formats

by jimbojones (Friar)
on Aug 15, 2007 at 15:50 UTC ( #632775=note: print w/replies, xml ) Need Help??

in reply to Archive::Zip Problem: Zip versus Jar file formats


The Archive::Zip module will not compress members if the uncompressed size is 0. However, the jar command seems to add an additional "external local header" to the data.

So, when A::Z writes out the data, since it thinks it's 0 bytes, it writes out uncompressed, but also writes ou the external header(?), giving you the "only DEFLATED entries can have EXT descriptor" error.

This link seems to show something similar in python that might have some insights:

I tested this with A::Z v1.20, and I think it's a bug with A::Z. I was poking around in A::Z::Member::rewindData to see what it does with 0 byte compressed data.

Also, running zip against the file gives:

>zip bar.jar zip warning: extended local header not found for META-INF/ zip error: Zip file structure invalid (bar.jar)
Hope this helps, Jim

Replies are listed 'Best First'.
Re^2: Archive::Zip Problem: Zip versus Jar file formats
by Anonymous Monk on Aug 15, 2007 at 16:06 UTC
    Thanks Jimbo and Joost. I wanted a second opinion before I opened an issue and these insights will help me more effectively communicate the issue to the author. Cheers
      Yeah, I was able to reproduce this purely with the zip
      program, so I know it is not a subtle oddity of format for JAR's.
        OK, I just deleted the 'META-INF/' memeber before writing it back out and it works fine...the contents of META-INF/ are separate entries themselves so I don't lose anything...

        So, the issue is with the lone directory member and both zip and jar complain. It looks like a problem with Archive::Zip to me. I'm happy because I love this module and I can use it without waiting for a fix!!! Here is the code to create good and bad:

        #!/usr/bin/perl -w use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); use strict; my $az_foo = Archive::Zip->new('foo.jar'); die 'write error' unless $az_foo->overwriteAs('bar_bad.jar') == AZ_OK; my ( $meta_inf_member) = $az_foo->removeMember('META-INF/'); die unless $meta_inf_member; die 'write error' unless $az_foo->overwriteAs('bar_good.jar') == AZ_OK +;

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://632775]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2022-01-27 21:29 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (71 votes). Check out past polls.