#
# Copyright (c) 2007, 2008, Oracle and/or its affiliates. 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.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.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

java.launcher.cls.error1=\
    Error: Could not find main class {0}
java.launcher.cls.error2=\
    Error: Main method is not {0} in class {1}, please define the main method as:\n\
\   public static void main(String[] args)
java.launcher.cls.error3=\
    Error: Main method must return a value of type void in class {0}, please \n\
    define the main method as:\n\
\   public static void main(String[] args)
java.launcher.cls.error4=\
    Error: Main method not found in class {0}, please define the main method as:\n\
\   public static void main(String[] args)


