#
# Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

error.cant.open=\
     can''t open: {0} 
error.illegal.option=\
        Illegal option: {0}
error.bad.option=\
        One of options -{ctxu} must be specified.
error.bad.cflag=\
        'c' flag requires manifest or input files to be specified!
error.bad.uflag=\
        'u' flag requires manifest, 'e' flag or input files to be specified!
error.bad.eflag=\
	'e' flag and manifest with the 'Main-Class' attribute cannot be specified \n\
	 together!
error.nosuch.fileordir=\
        {0} : no such file or directory
error.write.file=\
        Error in writing existing jar file
error.create.dir=\
        {0} : could not create directory
error.incorrect.length=\
        incorrect length while processing: {0}
out.added.manifest=\
        added manifest
out.update.manifest=\
        updated manifest
out.ignore.entry=\
        ignoring entry {0}
out.adding=\
        adding: {0}
out.deflated=\
        (deflated {0}%)
out.stored=\
        (stored 0%)
out.create=\
        \ \ created: {0}
out.extracted=\
        extracted: {0}
out.inflated=\
        \ \inflated: {0}
out.size=\
        (in = {0}) (out= {1})

usage=\
Usage: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\
Options:\n\
\ \   -c  create new archive\n\
\ \   -t  list table of contents for archive\n\
\ \   -x  extract named (or all) files from archive\n\
\ \   -u  update existing archive\n\
\ \   -v  generate verbose output on standard output\n\
\ \   -f  specify archive file name\n\
\ \   -m  include manifest information from specified manifest file\n\
\ \   -e  specify application entry point for stand-alone application \n\
\ \       bundled into an executable jar file\n\
\ \   -0  store only; use no ZIP compression\n\
\ \   -M  do not create a manifest file for the entries\n\
\ \   -i  generate index information for the specified jar files\n\
\ \   -C  change to the specified directory and include the following file\n\
If any file is a directory then it is processed recursively.\n\
The manifest file name, the archive file name and the entry point name are\n\
specified in the same order as the 'm', 'f' and 'e' flags.\n\n\
Example 1: to archive two class files into an archive called classes.jar: \n\
\ \      jar cvf classes.jar Foo.class Bar.class \n\
Example 2: use an existing manifest file 'mymanifest' and archive all the\n\
\ \          files in the foo/ directory into 'classes.jar': \n\
\ \      jar cvfm classes.jar mymanifest -C foo/ .\n
