diff -r 73fd39e0702e -r ea3137042a61 jdk/src/java.base/share/native/libjli/java.c --- a/jdk/src/java.base/share/native/libjli/java.c Mon Apr 24 13:43:34 2017 +0800 +++ b/jdk/src/java.base/share/native/libjli/java.c Thu May 04 07:26:55 2017 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, 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 @@ -71,7 +71,10 @@ static jboolean printXUsage = JNI_FALSE; /* print and exit*/ static jboolean dryRun = JNI_FALSE; /* initialize VM and exit */ static char *showSettings = NULL; /* print but continue */ -static char *listModules = NULL; +static jboolean showResolvedModules = JNI_FALSE; +static jboolean listModules = JNI_FALSE; +static char *describeModule = NULL; +static jboolean validateModules = JNI_FALSE; static const char *_program_name; static const char *_launcher_name; @@ -118,7 +121,10 @@ static void PrintJavaVersion(JNIEnv *env, jboolean extraLF); static void PrintUsage(JNIEnv* env, jboolean doXUsage); static void ShowSettings(JNIEnv* env, char *optString); -static void ListModules(JNIEnv* env, char *optString); +static void ShowResolvedModules(JNIEnv* env); +static void ListModules(JNIEnv* env); +static void DescribeModule(JNIEnv* env, char* optString); +static jboolean ValidateModules(JNIEnv* env); static void SetPaths(int argc, char **argv); @@ -409,12 +415,34 @@ CHECK_EXCEPTION_LEAVE(1); } - if (listModules != NULL) { - ListModules(env, listModules); + // show resolved modules and continue + if (showResolvedModules) { + ShowResolvedModules(env); + CHECK_EXCEPTION_LEAVE(1); + } + + // list observable modules, then exit + if (listModules) { + ListModules(env); CHECK_EXCEPTION_LEAVE(1); LEAVE(); } + // describe a module, then exit + if (describeModule != NULL) { + DescribeModule(env, describeModule); + CHECK_EXCEPTION_LEAVE(1); + LEAVE(); + } + + // validate modules on the module path, then exit + if (validateModules) { + jboolean okay = ValidateModules(env); + CHECK_EXCEPTION_LEAVE(1); + if (!okay) ret = 1; + LEAVE(); + } + if (printVersion || showVersion) { PrintJavaVersion(env, showVersion); CHECK_EXCEPTION_LEAVE(0); @@ -552,7 +580,8 @@ IsLauncherOption(const char* name) { return IsClassPathOption(name) || IsLauncherMainOption(name) || - JLI_StrCmp(name, "--list-modules") == 0; + JLI_StrCmp(name, "--describe-module") == 0 || + JLI_StrCmp(name, "-d") == 0; } /* @@ -1199,7 +1228,7 @@ } else if (JLI_StrCCmp(arg, "--") == 0 && (equals = JLI_StrChr(arg, '=')) != NULL) { value = equals+1; - if (JLI_StrCCmp(arg, "--list-modules=") == 0 || + if (JLI_StrCCmp(arg, "--describe-module=") == 0 || JLI_StrCCmp(arg, "--module=") == 0 || JLI_StrCCmp(arg, "--class-path=") == 0) { kind = LAUNCHER_OPTION_WITH_ARGUMENT; @@ -1263,18 +1292,18 @@ REPORT_ERROR (has_arg_any_len, ARG_ERROR1, arg); SetClassPath(value); mode = LM_CLASS; - } else if (JLI_StrCmp(arg, "--list-modules") == 0 || - JLI_StrCCmp(arg, "--list-modules=") == 0) { - listModules = arg; - - // set listModules to --list-modules= if argument is specified - if (JLI_StrCmp(arg, "--list-modules") == 0 && has_arg) { - static const char format[] = "%s=%s"; - size_t buflen = JLI_StrLen(option) + 2 + JLI_StrLen(value); - listModules = JLI_MemAlloc(buflen); - JLI_Snprintf(listModules, buflen, format, option, value); - } - return JNI_TRUE; + } else if (JLI_StrCmp(arg, "--list-modules") == 0) { + listModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--show-resolved-modules") == 0) { + showResolvedModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--validate-modules") == 0) { + AddOption("-Djdk.module.minimumBoot=true", NULL); + validateModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--describe-module") == 0 || + JLI_StrCCmp(arg, "--describe-module=") == 0 || + JLI_StrCmp(arg, "-d") == 0) { + REPORT_ERROR (has_arg_any_len, ARG_ERROR12, arg); + describeModule = value; /* * Parse white-space options */ @@ -1336,9 +1365,8 @@ showSettings = arg; } else if (JLI_StrCmp(arg, "-Xdiag") == 0) { AddOption("-Dsun.java.launcher.diag=true", NULL); - AddOption("-Djdk.launcher.traceResolver=true", NULL); - } else if (JLI_StrCmp(arg, "-Xdiag:resolver") == 0) { - AddOption("-Djdk.launcher.traceResolver=true", NULL); + } else if (JLI_StrCmp(arg, "--show-module-resolution") == 0) { + AddOption("-Djdk.module.showModuleResolution=true", NULL); /* * The following case provide backward compatibility with old-style * command line options. @@ -1399,7 +1427,10 @@ } if (*pwhat == NULL) { - *pret = 1; + /* LM_UNKNOWN okay for options that exit */ + if (!listModules && !describeModule && !validateModules) { + *pret = 1; + } } else if (mode == LM_UNKNOWN) { /* default to LM_CLASS if -m, -jar and -cp options are * not specified */ @@ -1828,21 +1859,61 @@ } /** - * List modules supported by the runtime + * Show resolved modules + */ +static void +ShowResolvedModules(JNIEnv *env) +{ + jmethodID showResolvedModulesID; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); + NULL_CHECK(showResolvedModulesID = (*env)->GetStaticMethodID(env, cls, + "showResolvedModules", "()V")); + (*env)->CallStaticVoidMethod(env, cls, showResolvedModulesID); +} + +/** + * List observable modules */ static void -ListModules(JNIEnv *env, char *optString) +ListModules(JNIEnv *env) { jmethodID listModulesID; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); + NULL_CHECK(listModulesID = (*env)->GetStaticMethodID(env, cls, + "listModules", "()V")); + (*env)->CallStaticVoidMethod(env, cls, listModulesID); +} + +/** + * Describe a module + */ +static void +DescribeModule(JNIEnv *env, char *optString) +{ + jmethodID describeModuleID; jstring joptString = NULL; jclass cls = GetLauncherHelperClass(env); NULL_CHECK(cls); - NULL_CHECK(listModulesID = (*env)->GetStaticMethodID(env, cls, - "listModules", "(ZLjava/lang/String;)V")); + NULL_CHECK(describeModuleID = (*env)->GetStaticMethodID(env, cls, + "describeModule", "(Ljava/lang/String;)V")); NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString)); - (*env)->CallStaticVoidMethod(env, cls, listModulesID, - USE_STDOUT, - joptString); + (*env)->CallStaticVoidMethod(env, cls, describeModuleID, joptString); +} + +/** + * Validate modules + */ +static jboolean +ValidateModules(JNIEnv *env) +{ + jmethodID validateModulesID; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK_RETURN_VALUE(cls, JNI_FALSE); + validateModulesID = (*env)->GetStaticMethodID(env, cls, "validateModules", "()Z"); + NULL_CHECK_RETURN_VALUE(cls, JNI_FALSE); + return (*env)->CallStaticBooleanMethod(env, cls, validateModulesID); } /*