GNU-style options for the Jar Tool
Chris Hegarty
chris.hegarty at oracle.com
Wed Jan 20 22:40:35 UTC 2016
> On 20 Jan 2016, at 22:27, Dmitry Samersoff <dmitry.samersoff at oracle.com> wrote:
>
> Chris,
>
> (slightly offtopic)
>
> Is there any plan to introduce standard command line parsing routine?
Glad you brought this up Dmitry.
We have been using JOpt Simple [1] in jigsaw/jake [2] for parsing
command line arguments for any new tools. I plan to propose to bring
this into the JDK 9 mainline soon. Where possible, any new tools should
consider using it.
Given the compatibility constrains of existing command line arguments
in the Jar Tool, JOpt Simple was not a good fit.
-Chris.
[1] https://pholser.github.io/jopt-simple/ <https://pholser.github.io/jopt-simple/>
[2] http://hg.openjdk.java.net/jigsaw/jake/jdk/file/tip/src/jdk.internal.opt/share/classes
> e.g.
> http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/tip/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SAGetopt.java
>
> -Dmitry
>
> On 2016-01-19 19:54, Chris Hegarty wrote:
>> GNU-style options for Jar Tool
>>
>> Prompted by the impending addition of new options for both multi-release jars
>> and jigsaw, it became immediately obvious that we were running out of single
>> characters that could be used to represent these new options. I'd like to
>> propose an update to the Jar Tool CLI to accept GNU-style options ( all short
>> forms being compatible with the existing current options ), so that we can
>> evolve the CLI in a reasonable fashion going forward.
>>
>> For example:
>> # Create an archive called classes.jar with two class files:
>> jar --create --file classes.jar Foo.class Bar.class
>> # Create an archive using an existing manifest, with all the files in foo/:
>> jar --create --file classes.jar --manifest mymanifest -C foo/ .
>>
>> The complete output of '--help' can be seen below [*]
>>
>> Short forms are the same as existing current options.
>>
>> It was suggested over on jigsaw-dev that the help output could drop the
>> compatibility interface. Only printing it if '--help:compatility', or similar.
>>
>> http://cr.openjdk.java.net/~chegar/jartool.options/
>>
>> -Chris
>>
>> P.S. jigsaw and multi-release jars will add the current list of exiting
>> options.
>>
>> [*] ( there may be some formatting issue in email )
>> $ ./jdk/bin/jar --help
>> Usage: jar [OPTION...] [-C dir] files ...
>> jar creates an archive for classes and resources, and can manipulate or
>> restore individual classes or resources from an archive.
>>
>> Examples:
>> # Create an archive called classes.jar with two class files:
>> jar --create --file classes.jar Foo.class Bar.class
>> # Create an archive using an existing manifest, with all the files in foo/:
>> jar --create --file classes.jar --manifest mymanifest -C foo/ .
>>
>>
>> Main operation mode:
>> -c, --create Create the archive
>> -i, --generate-index=FILE Generate index information for the specified jar
>> archives
>> -t, --list List the table of contents for the archive
>> -u, --update Update an existing jar archive
>> -x, --extract Extract named (or all) files from the archive
>>
>> Operation modifiers valid in any mode:
>>
>> -C DIR, Change to the specified directory and include the
>> following file
>> -f, --file=FILE The archive file name
>> -v, --verbose Generate verbose output on standard output
>>
>> Operation modifiers valid only in create mode:
>> -n, --pack200 Perform Pack200 normalization after creating a
>> new archive
>>
>> Operation modifiers valid only in create and update mode:
>> -e, --main-class=CLASSNAME The application entry point for stand-alone
>> applications bundled into a modular, or executable,
>> jar archive
>> -m, --manifest=FILE Include the manifest information from the given
>> manifest file
>> -M, --no-manifest Do not create a manifest file for the entries
>>
>> Operation modifiers valid only in create, update, and generate-index mode:
>> -0, --no-compress Store only; use no ZIP compression
>>
>> Other options:
>> -?, --help give this help list
>> --version print program version
>>
>> Mandatory or optional arguments to long options are also mandatory or optional
>> for any corresponding short options.
>>
>>
>> Compatibility Interface:
>>
>> Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
>> Options:
>> -c create new archive
>> -t list table of contents for archive
>> -x extract named (or all) files from archive
>> -u update existing archive
>> -v generate verbose output on standard output
>> -f specify archive file name
>> -m include manifest information from specified manifest file
>> -n perform Pack200 normalization after creating a new archive
>> -e specify application entry point for stand-alone application
>> bundled into an executable jar file
>> -0 store only; use no ZIP compression
>> -P preserve leading '/' (absolute path) and ".." (parent directory) components from file names
>> -M do not create a manifest file for the entries
>> -i generate index information for the specified jar files
>> -C change to the specified directory and include the following file
>> If any file is a directory then it is processed recursively.
>> The manifest file name, the archive file name and the entry point name are
>> specified in the same order as the 'm', 'f' and 'e' flags.
>>
>> Example 1: to archive two class files into an archive called classes.jar:
>> jar cvf classes.jar Foo.class Bar.class
>> Example 2: use an existing manifest file 'mymanifest' and archive all the
>> files in the foo/ directory into 'classes.jar':
>> jar cvfm classes.jar mymanifest -C foo/ .
>>
>>
>
>
> --
> Dmitry Samersoff
> Oracle Java development team, Saint Petersburg, Russia
> * I would love to change the world, but they won't give me the sources.
More information about the jdk9-dev
mailing list