RFR: 8173970: jar tool should have a way to extract to a directory

Jaikiran Pai jai.forums2013 at gmail.com
Wed Mar 3 10:14:18 UTC 2021

Thank you Lance. So I think there's some level of agreement on using -C 
and --dir (or --directory) for the option names.

Anymore opinion on the directory creation semantics and any other 
aspects to consider?


On 28/02/21 5:38 pm, Lance Andersen wrote:
> Hi Jaikiran,
> Thank you for this.  I went through this myself yesterday in addition 
> to what you have below here are a few more:
> 7zip:       -o
> Info-zip:  -d  (MacOS version of zip)
> Bandzip: -o:{dir}
> jpackage: -d —dest
> jlink —output
> Thinking about this some more, I might suggest supporting
> -C
> —dir
> —directory
> Best
> Lance
>> On Feb 27, 2021, at 11:19 PM, Jaikiran Pai <jai.forums2013 at gmail.com 
>> <mailto:jai.forums2013 at gmail.com>> wrote:
>> Hello Alan,
>> On 27/02/21 2:23 pm, Alan Bateman wrote:
>>> Yes, the option name will need to be agreed. It would be useful to 
>>> enumerate the options that the other tools are using to specify the 
>>> location where to extract. If you see JBS issues mentioning tar -C 
>>> not supporting chdir when extracting then it might be Solaris tar, 
>>> which isn't the same as GNU tar which has different options. It 
>>> might be better to look at more main stream tools, like unzip 
>>> although jar -d is already taken. It would be nice if there were 
>>> some consistency with other tools in the JDK that doing extracting 
>>> (The jmod and jimage extract commands use use --dir for example).
>> I had a look at both tar and unzip commands on MacOS and Linux 
>> (CentOS) setup that I had access to.
>> --------------
>> tar on MacOS:
>> --------------
>> tar --version
>> bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
>> The version of this tool has:
>> -C directory, --cd directory, --directory directory
>>              In c and r mode, this changes the directory before 
>> adding the following files.
>>              In x mode, change directories after opening the archive 
>> but before extracting
>>              entries from the archive.
>> A command like "tar -xzf foo.tar.gz -C /tmp/bar/" works fine and 
>> extracts the foo.tar.gz from current directory to a target directory 
>> /tmp/bar/
>> --------------
>> tar on CentOS:
>> --------------
>> tar --version
>> tar (GNU tar) 1.26
>> This version of the tool has:
>> Common options:
>>        -C, --directory=DIR
>>               change to directory DIR
>> Although the wording isn't clear that, when used with -x, it extracts 
>> to the directory specified in -C, it does indeed behave that way.
>> Specifically, a command like "tar -xzf foo.tar.gz -C /tmp/bar/" works 
>> fine and extracts the foo.tar.gz from current directory to a target 
>> directory /tmp/bar/
>> -------------------------------
>> unzip on both MacOS and CentOS:
>> -------------------------------
>> unzip -v
>> UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.
>> This version of the tool has:
>> [-d exdir]
>>               An optional directory to which to extract files.  By 
>> default, all files and sub-
>>               directories are recreated in the current directory; the 
>> -d option allows extrac-
>>               tion in an arbitrary directory (always assuming one has 
>> permission to  write  to
>>               the  directory).  This option need not appear at the 
>> end of the command line; it
>>               is also accepted before the zipfile specification 
>> (with  the  normal  options),
>>               immediately  after  the zipfile specification, or 
>> between the file(s) and the -x
>>               option.  The option and directory may be concatenated 
>> without  any  white  space
>>               between  them,  but  note  that  this may cause normal 
>> shell behavior to be sup-
>>               pressed.  In particular, ``-d ~'' (tilde) is expanded 
>> by Unix C shells into  the
>>               name of the user's home directory, but ``-d~'' is 
>> treated as a literal subdirec-
>>               tory ``~'' of the current directory.
>> unzip foo.zip -d /tmp/bar/ works fine and extracts the foo.zip from 
>> current directory to /tmp/bar/
>> ---------------
>> jimage and jmod
>> ---------------
>> The jimage and jmod as you note use the --dir option for extracting 
>> to that specified directory.
>> Those were the tools I looked at. I think using the -d option with -x 
>> for the jar command is ruled out since it already is used for a 
>> different purpose, although for a different "main" operation of the 
>> jar command.
>> As for using --dir for this new feature, I don't think it alone will 
>> be enough. Specifically, I couldn't find a "short form" option for 
>> the --dir option in the jimage or jmod commands. For the jar extract 
>> feature that we are discussing here, I think having a short form 
>> option (in addition to the longer form) is necessary to have it match 
>> the usage expectations of similar other options that the jar command 
>> exposes. So even if we do choose --dir as the long form option, we 
>> would still need a short form for it and since -d is already taken 
>> for something else, we would still need to come up with a different 
>> one. The short form of this option could be -C (see below).
>> I think reusing the -C option, for this new feature, perhaps is a 
>> good thing. The -C is currently used by the update and create "main" 
>> operation of the jar command and the man page for this option states:
>> -C dir
>>               When creating (c) or updating (u) a JAR file, this 
>> option temporarily changes
>>               the directory while processing files specified by the 
>> file operands. Its
>>               operation is intended to be similar to the -C option of 
>> the UNIX tar utility.For
>>               example, the following command changes to the classes 
>> directory and adds the
>>               Bar.class file from that directory to my.jar:
>>               jar uf my.jar -C classes Bar.class
>> ....
>> Using the -C option would indeed align it with the tar command. For 
>> the "long form" of this option, the tar command (both on MacOS and 
>> CentOS) uses --directory. For this jar extract feature though, we 
>> could perhaps just use --dir to have it align with the jimage and the 
>> jmod tools.
>> So I think the combination of -C (short form) and --dir (long form) 
>> would perhaps be suitable for this feature.
>>> There are other discussion points around the behavior when the 
>>> target directory exists or does not exist, to ensure there is some 
>>> consistency with main stream tools.
>> I'm guessing you mean the behaviour of creating a directory (or a 
>> hierarchy of directories) if the target directory is not present? My 
>> testing with the tar tool (both on MacOS and CentOS) shows that if 
>> the specified target directory doesn't exist, then the extract fails. 
>> The tar extract command doesn't create the target directory during 
>> extract. On the other hand, the unzip tool, does create the directory 
>> if it doesn't exist. However, interestingly, the unzip tool creates 
>> only one level of that directory if it doesn't exist. Specifically, 
>> if you specify:
>> unzip foo.zip -d /tmp/blah/
>> and if "blah/" isn't a directory inside /tmp/ directory, then it 
>> creates the "blah/" directory inside /tmp/ and then extracts the 
>> contents of the zip into it.
>> However,
>> unzip foo.zip -d /tmp/blah/hello/
>> and if "blah/" isn't a directory inside /tmp/ directory, then this 
>> command fails with an error and it doesn't create the hierarchy of 
>> the target directories.
>> Coming to the jimage and the jmod commands, both these commands 
>> create the entire directory hierarchy if the target directory 
>> specified during extract, using --dir, doesn't exist. So a command like:
>> jimage extract --dir /tmp/blah/foo/bar/ jdkmodules
>> will create the blah/foo/bar/ directory hierarchy if blah doesn't 
>> exist in /tmp/, while extracting the "jdkmodules" image.
>> From the user point of view, I think this behaviour of creating the 
>> directories if the target directory doesn't exist, is probably the 
>> most intuitive and useful and if we did decide to use this approach 
>> for this new option for jar extract command, then it would align with 
>> what we already do in jimage and jmod commands.
>> One another minor detail, while we are at this, is that, IMO we 
>> should let the jar extract command to continue to behave the way it 
>> currently does when it comes to overwriting existing files. If the 
>> jar being extracted contains a file by the same name, in the target 
>> directory (hierarchy) then it should continue to overwrite that file. 
>> In other words, I don't think we should change the way the jar 
>> extract command currently behaves where it overwrites existing files 
>> when extracting.
>> -Jaikiran
> Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
> Oracle Java Engineering
> 1 Network Drive
> Burlington, MA 01803
> Lance.Andersen at oracle.com <mailto:Lance.Andersen at oracle.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20210303/64f0359a/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: oracle_sig_logo.gif
Type: image/gif
Size: 658 bytes
Desc: not available
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20210303/64f0359a/oracle_sig_logo-0001.gif>

More information about the compiler-dev mailing list