#
# Copyright 2007 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.
#

# Translators please note do not translate the options themselves
java.launcher.opt.header  =   Usage: {0} [-options] class [args...]\n\
\           (to execute a class)\n   or  {0} [-options] -jar jarfile [args...]\n\
\           (to execute a jar file)\n\
where options include:\n

java.launcher.opt.datamodel  =\    -d{0}\t  use a {0}-bit data model if available\n
java.launcher.opt.vmselect   =\    {0}\t  to select the "{1}" VM\n
java.launcher.opt.hotspot    =\    {0}\t  is a synonym for the "{1}" VM  [deprecated]\n

java.launcher.ergo.message1  =\                  The default VM is {0}
java.launcher.ergo.message2  =\                  because you are running on a server-class machine.\n

# Translators please note do not translate the options themselves
java.launcher.opt.footer     =\    -cp <class search path of directories and zip/jar files>\n\
\    -classpath <class search path of directories and zip/jar files>\n\
\                  A {0} separated list of directories, JAR archives,\n\
\                  and ZIP archives to search for class files.\n\
\    -D<name>=<value>\n\
\                  set a system property\n\
\    -verbose[:class|gc|jni]\n\
\                  enable verbose output\n\
\    -version      print product version and exit\n\
\    -version:<value>\n\
\                  require the specified version to run\n\
\    -showversion  print product version and continue\n\
\    -jre-restrict-search | -jre-no-restrict-search\n\
\                  include/exclude user private JREs in the version search\n\
\    -? -help      print this help message\n\
\    -X            print help on non-standard options\n\
\    -ea[:<packagename>...|:<classname>]\n\
\    -enableassertions[:<packagename>...|:<classname>]\n\
\                  enable assertions with specified granularity\n\
\    -da[:<packagename>...|:<classname>]\n\
\    -disableassertions[:<packagename>...|:<classname>]\n\
\                  disable assertions with specified granularity\n\
\    -esa | -enablesystemassertions\n\
\                  enable system assertions\n\
\    -dsa | -disablesystemassertions\n\
\                  disable system assertions\n\
\    -agentlib:<libname>[=<options>]\n\
\                  load native agent library <libname>, e.g. -agentlib:hprof\n\
\                  see also, -agentlib:jdwp=help and -agentlib:hprof=help\n\
\    -agentpath:<pathname>[=<options>]\n\
\                  load native agent library by full pathname\n\
\    -javaagent:<jarpath>[=<options>]\n\
\                  load Java programming language agent, see java.lang.instrument\n\
\    -splash:<imagepath>\n\
\                  show splash screen with specified image\n\
See http://java.sun.com/javase/reference for more details.

# Translators please note do not translate the options themselves
java.launcher.X.usage=\
\    -Xmixed           mixed mode execution (default)\n\
\    -Xint             interpreted mode execution only\n\
\    -Xbootclasspath:<directories and zip/jar files separated by {0}>\n\
\                      set search path for bootstrap classes and resources\n\
\    -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n\
\                      append to end of bootstrap class path\n\
\    -Xbootclasspath/p:<directories and zip/jar files separated by {0}>\n\
\                      prepend in front of bootstrap class path\n\
\    -Xnoclassgc       disable class garbage collection\n\
\    -Xincgc           enable incremental garbage collection\n\
\    -Xloggc:<file>    log GC status to a file with time stamps\n\
\    -Xbatch           disable background compilation\n\
\    -Xms<size>        set initial Java heap size\n\
\    -Xmx<size>        set maximum Java heap size\n\
\    -Xss<size>        set java thread stack size\n\
\    -Xprof            output cpu profiling data\n\
\    -Xfuture          enable strictest checks, anticipating future default\n\
\    -Xrs              reduce use of OS signals by Java/VM (see documentation)\n\
\    -Xcheck:jni       perform additional checks for JNI functions\n\
\    -Xshare:off       do not attempt to use shared class data\n\
\    -Xshare:auto      use shared class data if possible (default)\n\
\    -Xshare:on        require using shared class data, otherwise fail.\n\n\
The -X options are non-standard and subject to change without notice.\n
