《jdk8u源码分析》9.TranslateApplicationArgs

src/share/bin/java.c::TranslateApplicationArgs

/*
 * For tools, convert command line args thus:
 *   javac -cp foo:foo/"*" -J-ms32m ...
 *   java -ms32m -cp JLI_WildcardExpandClasspath(foo:foo/"*") ...
 *
 * Takes 4 parameters, and returns the populated arguments
 */
static void
TranslateApplicationArgs(int jargc, const char **jargv, int *pargc, char ***pargv)
{
    int argc = *pargc;
    char **argv = *pargv;
    int nargc = argc + jargc;
    char **nargv = JLI_MemAlloc((nargc + 1) * sizeof(char *));
    int i;

    *pargc = nargc;
    *pargv = nargv;

    /* Copy the VM arguments (i.e. prefixed with -J) */
    //拷贝Java参数(VM编译时定义的参数)中以'-J'开头的参数到nagrv中,去除'-J'
    for (i = 0; i < jargc; i++) {
        const char *arg = jargv[i];
        if (arg[0] == '-' && arg[1] == 'J') {
            *nargv++ = ((arg + 2) == NULL) ? NULL : JLI_StringDup(arg + 2);
        }
    }

    //拷贝命令行参数(main.c::main方法入口参数)中以'-J'开头的参数到nagrv中,去除'-J'
    for (i = 0; i < argc; i++) {
        char *arg = argv[i];
        if (arg[0] == '-' && arg[1] == 'J') {
            if (arg[2] == '\0') {
            	//"Error: The -J option should not be followed by a space."
                JLI_ReportErrorMessage(ARG_ERROR3);
                exit(1);
            }
            *nargv++ = arg + 2;
        }
    }

    /* Copy the rest of the arguments */
	//拷贝Java参数中剩余的参数到nagrv中
    for (i = 0; i < jargc ; i++) {
        const char *arg = jargv[i];
        if (arg[0] != '-' || arg[1] != 'J') {
            *nargv++ = (arg == NULL) ? NULL : JLI_StringDup(arg);
        }
    }
	//拷贝命令行参数中剩余的参数到nagrv中
    for (i = 0; i < argc; i++) {
        char *arg = argv[i];
        if (arg[0] == '-') {
            if (arg[1] == 'J')
                continue;
            //如果支持通配符且参数名为-cp | -classpath 
            if (IsWildCardEnabled() && arg[1] == 'c'
                && (JLI_StrCmp(arg, "-cp") == 0 ||
                    JLI_StrCmp(arg, "-classpath") == 0)
                && i < argc - 1) {
                *nargv++ = arg;
            	//列出所有匹配的jar包,并添加到nagrv
            	//只能匹配到目录:C:\Program Files\Java\jre1.8.0_172\lib\*
            	//无法匹配:C:\Program Files\Java\jre1.8.0_172\lib\*.jar
                *nargv++ = (char *) JLI_WildcardExpandClasspath(argv[i+1]);
                i++;
                continue;
            }
        }
        *nargv++ = arg;
    }
    *nargv = 0;
}

src/share/bin/java.c::IsWildCardEnabled

static jboolean
IsWildCardEnabled()
{
	//取决于是否定义宏变量:EXPAND_CLASSPATH_WILDCARDS
    return _wc_enabled;
}

src/share/bin/defines.h::EXPAND_CLASSPATH_WILDCARDS

#ifdef EXPAND_CLASSPATH_WILDCARDS
static const jboolean const_cpwildcard = JNI_TRUE;
#else
static const jboolean const_cpwildcard = JNI_FALSE;
#endif /* EXPAND_CLASSPATH_WILDCARDS */

猜你喜欢

转载自blog.csdn.net/weixin_37477523/article/details/88363949