/*
* Parses command line arguments. Returns JNI_FALSE if launcher
* should exit without starting vm, returns JNI_TRUE if vm needs
* to be started to process given options. *pret (the launcher
* process return value) is set to 0 for a normal exit.
*/static jboolean
ParseArguments(int*pargc,char***pargv,int*pmode,char**pwhat,int*pret,constchar*jrepath){int argc =*pargc;char**argv =*pargv;int mode = LM_UNKNOWN;char*arg;*pret =0;//将以'-'开始的命令行参数转换为JVM可选参数while((arg =*argv)!=0&&*arg =='-'){
argv++;--argc;if(JLI_StrCmp(arg,"-classpath")==0||JLI_StrCmp(arg,"-cp")==0){//"Error: %s requires class path specification"
ARG_CHECK (argc, ARG_ERROR1, arg);//@see: 11.SetClassPathSetClassPath(*argv);
mode = LM_CLASS;
argv++;--argc;}elseif(JLI_StrCmp(arg,"-jar")==0){//"Error: %s requires jar file specification"
ARG_CHECK (argc, ARG_ERROR2, arg);
mode = LM_JAR;}elseif(JLI_StrCmp(arg,"-help")==0||JLI_StrCmp(arg,"-h")==0||JLI_StrCmp(arg,"-?")==0){
printUsage = JNI_TRUE;return JNI_TRUE;}elseif(JLI_StrCmp(arg,"-version")==0){
printVersion = JNI_TRUE;return JNI_TRUE;}elseif(JLI_StrCmp(arg,"-showversion")==0){
showVersion = JNI_TRUE;}elseif(JLI_StrCmp(arg,"-X")==0){
printXUsage = JNI_TRUE;return JNI_TRUE;/*
* The following case checks for -XshowSettings OR -XshowSetting:SUBOPT.
* In the latter case, any SUBOPT value not recognized will default to "all"
*/}elseif(JLI_StrCmp(arg,"-XshowSettings")==0||JLI_StrCCmp(arg,"-XshowSettings:")==0){
showSettings = arg;}elseif(JLI_StrCmp(arg,"-Xdiag")==0){//@see: 10.AddApplicationOptionsAddOption("-Dsun.java.launcher.diag=true",NULL);/*
* The following case provide backward compatibility with old-style
* command line options.
*/}elseif(JLI_StrCmp(arg,"-fullversion")==0){JLI_ReportMessage("%s full version \"%s\"", _launcher_name,GetFullVersion());return JNI_FALSE;}elseif(JLI_StrCmp(arg,"-verbosegc")==0){AddOption("-verbose:gc",NULL);}elseif(JLI_StrCmp(arg,"-t")==0){AddOption("-Xt",NULL);}elseif(JLI_StrCmp(arg,"-tm")==0){AddOption("-Xtm",NULL);}elseif(JLI_StrCmp(arg,"-debug")==0){AddOption("-Xdebug",NULL);}elseif(JLI_StrCmp(arg,"-noclassgc")==0){AddOption("-Xnoclassgc",NULL);}elseif(JLI_StrCmp(arg,"-Xfuture")==0){AddOption("-Xverify:all",NULL);}elseif(JLI_StrCmp(arg,"-verify")==0){AddOption("-Xverify:all",NULL);}elseif(JLI_StrCmp(arg,"-verifyremote")==0){AddOption("-Xverify:remote",NULL);}elseif(JLI_StrCmp(arg,"-noverify")==0){AddOption("-Xverify:none",NULL);}elseif(JLI_StrCCmp(arg,"-prof")==0){char*p = arg +5;char*tmp =JLI_MemAlloc(JLI_StrLen(arg)+50);if(*p){sprintf(tmp,"-Xrunhprof:cpu=old,file=%s", p +1);}else{sprintf(tmp,"-Xrunhprof:cpu=old,file=java.prof");}AddOption(tmp,NULL);}elseif(JLI_StrCCmp(arg,"-ss")==0||JLI_StrCCmp(arg,"-oss")==0||JLI_StrCCmp(arg,"-ms")==0||JLI_StrCCmp(arg,"-mx")==0){char*tmp =JLI_MemAlloc(JLI_StrLen(arg)+6);sprintf(tmp,"-X%s", arg +1);/* skip '-' */AddOption(tmp,NULL);}elseif(JLI_StrCmp(arg,"-checksource")==0||JLI_StrCmp(arg,"-cs")==0||JLI_StrCmp(arg,"-noasyncgc")==0){/* No longer supported *///"Warning: %s option is no longer supported."JLI_ReportErrorMessage(ARG_WARN, arg);}elseif(JLI_StrCCmp(arg,"-version:")==0||JLI_StrCmp(arg,"-no-jre-restrict-search")==0||JLI_StrCmp(arg,"-jre-restrict-search")==0||JLI_StrCCmp(arg,"-splash:")==0){;/* Ignore machine independent options already handled */}elseif(ProcessPlatformOption(arg)){;/* Processing of platform dependent options */}elseif(RemovableOption(arg)){;/* Do not pass option to vm. */}else{AddOption(arg,NULL);}}//命令行参数过滤掉所有以'-'开始后,将剩余的参数赋值给pwhat指针(用户参数)if(--argc >=0){*pwhat =*argv++;}if(*pwhat ==NULL){*pret =1;}elseif(mode == LM_UNKNOWN){/* default to LM_CLASS if -jar and -cp option are
* not specified *///设置默认启动模式:LM_CLASS
mode = LM_CLASS;}//将剩余的参数重新赋值给pagrv指针(外部调用)if(argc >=0){*pargc = argc;*pargv = argv;}//设置启动模式(外部调用)*pmode = mode;return JNI_TRUE;}
/*
* on windows, we return a false to indicate this option is not applicable
*/
jboolean
ProcessPlatformOption(constchar*arg){return JNI_FALSE;}
src/share/bin/java.c::RemovableOption
/*
* Return JNI_TRUE for an option string that has no effect but should
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On
* Solaris SPARC, this screening needs to be done if:
* -d32 or -d64 is passed to a binary with an unmatched data model
* (the exec in CreateExecutionEnvironment removes -d<n> options and points the
* exec to the proper binary). In the case of when the data model and the
* requested version is matched, an exec would not occur, and these options
* were erroneously passed to the vm.
*/
jboolean
RemovableOption(char* option){/*
* Unconditionally remove both -d32 and -d64 options since only
* the last such options has an effect; e.g.
* java -d32 -d64 -d32 -version
* is equivalent to
* java -d32 -version
*///@see:6.CreateExecutionEnvironment 用于判断jvm运行环境:64bit | 32bitif((JLI_StrCCmp(option,"-d32")==0)||(JLI_StrCCmp(option,"-d64")==0))return JNI_TRUE;elsereturn JNI_FALSE;}