--- 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=<module-names> 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);
}
/*