8136930: Simplify use of module-system options by custom launchers

Reviewed-by: coleenp, lfoltan, mchung
This commit is contained in:
Harold Seigel 2016-08-10 15:48:04 -07:00
parent bb1bd02549
commit d7ea24479b
47 changed files with 668 additions and 288 deletions

View File

@ -57,7 +57,7 @@ public final class Services {
if (jvmci != requestorModule) {
for (String pkg : jvmci.getPackages()) {
// Export all JVMCI packages dynamically instead
// of requiring a long list of -XaddExports
// of requiring a long list of --add-exports
// options on the JVM command line.
if (!jvmci.isExported(pkg, requestorModule)) {
jvmci.addExports(pkg, requestorModule);

View File

@ -140,7 +140,7 @@ PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = NULL;
PerfCounter* ClassLoader::_isUnsyncloadClass = NULL;
PerfCounter* ClassLoader::_load_instance_class_failCounter = NULL;
GrowableArray<ModuleClassPathList*>* ClassLoader::_xpatch_entries = NULL;
GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = NULL;
GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = NULL;
ClassPathEntry* ClassLoader::_jrt_entry = NULL;
ClassPathEntry* ClassLoader::_first_append_entry = NULL;
@ -685,27 +685,27 @@ bool ClassLoader::check_shared_paths_misc_info(void *buf, int size) {
}
#endif
// Construct the array of module/path pairs as specified to -Xpatch
// Construct the array of module/path pairs as specified to --patch-module
// for the boot loader to search ahead of the jimage, if the class being
// loaded is defined to a module that has been specified to -Xpatch.
void ClassLoader::setup_xpatch_entries() {
// loaded is defined to a module that has been specified to --patch-module.
void ClassLoader::setup_patch_mod_entries() {
Thread* THREAD = Thread::current();
GrowableArray<ModuleXPatchPath*>* xpatch_args = Arguments::get_xpatchprefix();
int num_of_entries = xpatch_args->length();
GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
int num_of_entries = patch_mod_args->length();
assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with -Xpatch");
assert(!UseSharedSpaces, "UseSharedSpaces not supported with -Xpatch");
assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with --patch-module");
assert(!UseSharedSpaces, "UseSharedSpaces not supported with --patch-module");
// Set up the boot loader's _xpatch_entries list
_xpatch_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
// Set up the boot loader's _patch_mod_entries list
_patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
for (int i = 0; i < num_of_entries; i++) {
const char* module_name = (xpatch_args->at(i))->module_name();
const char* module_name = (patch_mod_args->at(i))->module_name();
Symbol* const module_sym = SymbolTable::lookup(module_name, (int)strlen(module_name), CHECK);
assert(module_sym != NULL, "Failed to obtain Symbol for module name");
ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
char* class_path = (xpatch_args->at(i))->path_string();
char* class_path = (patch_mod_args->at(i))->path_string();
int len = (int)strlen(class_path);
int end = 0;
// Iterate over the module's class path entries
@ -735,10 +735,10 @@ void ClassLoader::setup_xpatch_entries() {
}
}
// Record the module into the list of -Xpatch entries only if
// Record the module into the list of --patch-module entries only if
// valid ClassPathEntrys have been created
if (module_cpl->module_first_entry() != NULL) {
_xpatch_entries->push(module_cpl);
_patch_mod_entries->push(module_cpl);
}
}
}
@ -1020,9 +1020,9 @@ void ClassLoader::print_bootclasspath() {
ClassPathEntry* e;
tty->print("[bootclasspath= ");
// Print -Xpatch module/path specifications first
if (_xpatch_entries != NULL) {
print_module_entry_table(_xpatch_entries);
// Print --patch-module module/path specifications first
if (_patch_mod_entries != NULL) {
print_module_entry_table(_patch_mod_entries);
}
// [jimage | exploded modules build]
@ -1341,7 +1341,7 @@ const char* ClassLoader::file_name_for_class_name(const char* class_name,
return file_name;
}
// Search either the xpatch or exploded build entries for class
// Search either the patch-module or exploded build entries for class
ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
const char* const class_name, const char* const file_name, TRAPS) {
ClassFileStream* stream = NULL;
@ -1366,7 +1366,7 @@ ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleCl
int num_of_entries = module_list->length();
const Symbol* class_module_name = mod_entry->name();
// Loop through all the modules in either the xpatch or exploded entries looking for module
// Loop through all the modules in either the patch-module or exploded entries looking for module
for (int i = 0; i < num_of_entries; i++) {
ModuleClassPathList* module_cpl = module_list->at(i);
Symbol* module_cpl_name = module_cpl->module_name();
@ -1378,7 +1378,7 @@ ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleCl
while (e != NULL) {
stream = e->open_stream(file_name, CHECK_NULL);
// No context.check is required since CDS is not supported
// for an exploded modules build or if -Xpatch is specified.
// for an exploded modules build or if --patch-module is specified.
if (NULL != stream) {
return stream;
}
@ -1420,32 +1420,32 @@ instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_onl
// If DumpSharedSpaces is true boot loader visibility boundaries are set to:
// - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
// No -Xpatch entries or exploded module builds are included since CDS
// is not supported if -Xpatch or exploded module builds are used.
// No --patch-module entries or exploded module builds are included since CDS
// is not supported if --patch-module or exploded module builds are used.
//
// If search_append_only is true, boot loader visibility boundaries are
// set to be _first_append_entry to the end. This includes:
// [-Xbootclasspath/a]; [jvmti appended entries]
//
// If both DumpSharedSpaces and search_append_only are false, boot loader
// visibility boundaries are set to be the -Xpatch entries plus the base piece.
// visibility boundaries are set to be the --patch-module entries plus the base piece.
// This would include:
// [-Xpatch:<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
// [--patch-module=<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
//
// DumpSharedSpaces and search_append_only are mutually exclusive and cannot
// be true at the same time.
assert(!(DumpSharedSpaces && search_append_only), "DumpSharedSpaces and search_append_only are both true");
// Load Attempt #1: -Xpatch
// Determine the class' defining module. If it appears in the _xpatch_entries,
// Load Attempt #1: --patch-module
// Determine the class' defining module. If it appears in the _patch_mod_entries,
// attempt to load the class from those locations specific to the module.
// Specifications to -Xpatch can contain a partial number of classes
// Specifications to --patch-module can contain a partial number of classes
// that are part of the overall module definition. So if a particular class is not
// found within its module specification, the search should continue to Load Attempt #2.
// Note: The -Xpatch entries are never searched if the boot loader's
// Note: The --patch-module entries are never searched if the boot loader's
// visibility boundary is limited to only searching the append entries.
if (_xpatch_entries != NULL && !search_append_only && !DumpSharedSpaces) {
stream = search_module_entries(_xpatch_entries, class_name, file_name, CHECK_NULL);
if (_patch_mod_entries != NULL && !search_append_only && !DumpSharedSpaces) {
stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
}
// Load Attempt #2: [jimage | exploded build]
@ -1650,11 +1650,11 @@ void ClassLoader::classLoader_init2(TRAPS) {
// Create the moduleEntry for java.base
create_javabase();
// Setup the list of module/path pairs for -Xpatch processing
// Setup the list of module/path pairs for --patch-module processing
// This must be done after the SymbolTable is created in order
// to use fast_compare on module names instead of a string compare.
if (Arguments::get_xpatchprefix() != NULL) {
setup_xpatch_entries();
if (Arguments::get_patch_mod_prefix() != NULL) {
setup_patch_mod_entries();
}
// Setup the initial java.base/path pair for the exploded build entries.

View File

@ -150,7 +150,7 @@ public:
// ModuleClassPathList contains a linked list of ClassPathEntry's
// that have been specified for a specific module. Currently,
// the only way to specify a module/path pair is via the -Xpatch
// the only way to specify a module/path pair is via the --patch-module
// command line option.
class ModuleClassPathList : public CHeapObj<mtClass> {
private:
@ -213,8 +213,8 @@ class ClassLoader: AllStatic {
static PerfCounter* _load_instance_class_failCounter;
// The boot class path consists of 3 ordered pieces:
// 1. the module/path pairs specified to -Xpatch
// -Xpatch:<module>=<file>(<pathsep><file>)*
// 1. the module/path pairs specified to --patch-module
// --patch-module=<module>=<file>(<pathsep><file>)*
// 2. the base piece
// [jimage | build with exploded modules]
// 3. boot loader append path
@ -223,8 +223,8 @@ class ClassLoader: AllStatic {
// The boot loader must obey this order when attempting
// to load a class.
// 1. Contains the module/path pairs specified to -Xpatch
static GrowableArray<ModuleClassPathList*>* _xpatch_entries;
// 1. Contains the module/path pairs specified to --patch-module
static GrowableArray<ModuleClassPathList*>* _patch_mod_entries;
// 2. the base piece
// Contains the ClassPathEntry of the modular java runtime image.
@ -256,11 +256,11 @@ class ClassLoader: AllStatic {
// Initialization:
// - setup the boot loader's system class path
// - setup the boot loader's xpatch entries, if present
// - setup the boot loader's patch mod entries, if present
// - create the ModuleEntry for java.base
static void setup_bootstrap_search_path();
static void setup_search_path(const char *class_path, bool setting_bootstrap);
static void setup_xpatch_entries();
static void setup_patch_mod_entries();
static void create_javabase();
static void load_zip_library();
@ -363,7 +363,7 @@ class ClassLoader: AllStatic {
// Add a module's exploded directory to the boot loader's exploded module build list
static void add_to_exploded_build_list(Symbol* module_name, TRAPS);
// Attempt load of individual class from either the xpatch or exploded modules build lists
// Attempt load of individual class from either the patched or exploded modules build lists
static ClassFileStream* search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
const char* const class_name,
const char* const file_name, TRAPS);

View File

@ -911,8 +911,8 @@ bool FileMapInfo::FileMapHeader::validate() {
return false;
}
if (Arguments::get_xpatchprefix() != NULL) {
FileMapInfo::fail_continue("The shared archive file cannot be used with -Xpatch.");
if (Arguments::get_patch_mod_prefix() != NULL) {
FileMapInfo::fail_continue("The shared archive file cannot be used with --patch-module.");
return false;
}

View File

@ -24,6 +24,8 @@
#include "precompiled.hpp"
#include "classfile/classLoaderExt.hpp"
#include "classfile/javaClasses.inline.hpp"
#include "classfile/stringTable.hpp"
#include "classfile/modules.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
@ -224,6 +226,7 @@ JvmtiEnv::GetNamedModule(jobject class_loader, const char* package_name, jobject
return JVMTI_ERROR_NONE;
} /* end GetNamedModule */
//
// Class functions
//
@ -3465,28 +3468,35 @@ jvmtiError
JvmtiEnv::GetSystemProperties(jint* count_ptr, char*** property_ptr) {
jvmtiError err = JVMTI_ERROR_NONE;
*count_ptr = Arguments::PropertyList_count(Arguments::system_properties());
// Get the number of readable properties.
*count_ptr = Arguments::PropertyList_readable_count(Arguments::system_properties());
// Allocate memory to hold the exact number of readable properties.
err = allocate(*count_ptr * sizeof(char *), (unsigned char **)property_ptr);
if (err != JVMTI_ERROR_NONE) {
return err;
}
int i = 0 ;
for (SystemProperty* p = Arguments::system_properties(); p != NULL && i < *count_ptr; p = p->next(), i++) {
const char *key = p->key();
char **tmp_value = *property_ptr+i;
err = allocate((strlen(key)+1) * sizeof(char), (unsigned char**)tmp_value);
if (err == JVMTI_ERROR_NONE) {
strcpy(*tmp_value, key);
} else {
// clean up previously allocated memory.
for (int j=0; j<i; j++) {
Deallocate((unsigned char*)*property_ptr+j);
int readable_count = 0;
// Loop through the system properties until all the readable properties are found.
for (SystemProperty* p = Arguments::system_properties(); p != NULL && readable_count < *count_ptr; p = p->next()) {
if (p->is_readable()) {
const char *key = p->key();
char **tmp_value = *property_ptr+readable_count;
readable_count++;
err = allocate((strlen(key)+1) * sizeof(char), (unsigned char**)tmp_value);
if (err == JVMTI_ERROR_NONE) {
strcpy(*tmp_value, key);
} else {
// clean up previously allocated memory.
for (int j=0; j<readable_count; j++) {
Deallocate((unsigned char*)*property_ptr+j);
}
Deallocate((unsigned char*)property_ptr);
break;
}
Deallocate((unsigned char*)property_ptr);
break;
}
}
assert(err != JVMTI_ERROR_NONE || readable_count == *count_ptr, "Bad readable property count");
return err;
} /* end GetSystemProperties */
@ -3498,7 +3508,8 @@ JvmtiEnv::GetSystemProperty(const char* property, char** value_ptr) {
jvmtiError err = JVMTI_ERROR_NONE;
const char *value;
value = Arguments::PropertyList_get_value(Arguments::system_properties(), property);
// Return JVMTI_ERROR_NOT_AVAILABLE if property is not readable or doesn't exist.
value = Arguments::PropertyList_get_readable_value(Arguments::system_properties(), property);
if (value == NULL) {
err = JVMTI_ERROR_NOT_AVAILABLE;
} else {

View File

@ -110,7 +110,7 @@ SystemProperty *Arguments::_java_home = NULL;
SystemProperty *Arguments::_java_class_path = NULL;
SystemProperty *Arguments::_jdk_boot_class_path_append = NULL;
GrowableArray<ModuleXPatchPath*> *Arguments::_xpatchprefix = NULL;
GrowableArray<ModulePatchPath*> *Arguments::_patch_mod_prefix = NULL;
PathString *Arguments::_system_boot_class_path = NULL;
bool Arguments::_has_jimage = false;
@ -161,6 +161,30 @@ static void logOption(const char* opt) {
}
}
bool needs_module_property_warning = false;
#define MODULE_PROPERTY_PREFIX "jdk.module"
#define MODULE_PROPERTY_PREFIX_LEN 10
#define MODULE_MAIN_PROPERTY "jdk.module.main"
#define MODULE_MAIN_PROPERTY_LEN 15
// Return TRUE if option matches property, or property=, or property..
static bool matches_property_prefix(const char* option, const char* property, size_t len) {
return (strncmp(option, property, len) == 0) &&
(option[len] == '=' || option[len] == '.' || option[len] == '\0');
}
// Return true if the property is either "jdk.module" or starts with "jdk.module.",
// but does not start with "jdk.module.main".
// Return false if jdk.module.main because jdk.module.main and jdk.module.main.class
// are valid non-internal system properties.
// "property" should be passed without the leading "-D".
bool Arguments::is_internal_module_property(const char* property) {
assert((strncmp(property, "-D", 2) != 0), "Unexpected leading -D");
return (matches_property_prefix(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) &&
!matches_property_prefix(property, MODULE_MAIN_PROPERTY, MODULE_MAIN_PROPERTY_LEN));
}
// Process java launcher properties.
void Arguments::process_sun_java_launcher_properties(JavaVMInitArgs* args) {
// See if sun.java.launcher, sun.java.launcher.is_altjvm or
@ -197,7 +221,7 @@ void Arguments::init_system_properties() {
_system_boot_class_path = new PathString(NULL);
PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.name",
"Java Virtual Machine Specification", false));
"Java Virtual Machine Specification", false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.version", VM_Version::vm_release(), false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.name", VM_Version::vm_name(), false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.info", VM_Version::vm_info_string(), true));
@ -1198,7 +1222,7 @@ const char* Arguments::get_property(const char* key) {
return PropertyList_get_value(system_properties(), key);
}
bool Arguments::add_property(const char* prop) {
bool Arguments::add_property(const char* prop, PropertyWriteable writeable, PropertyInternal internal) {
const char* eq = strchr(prop, '=');
const char* key;
const char* value = "";
@ -1228,7 +1252,9 @@ bool Arguments::add_property(const char* prop) {
// private and are processed in process_sun_java_launcher_properties();
// the sun.java.launcher property is passed on to the java application
} else if (strcmp(key, "sun.boot.library.path") == 0) {
PropertyList_unique_add(&_system_properties, key, value, true);
// append is true, writable is true, internal is false
PropertyList_unique_add(&_system_properties, key, value, AppendProperty,
WriteableProperty, ExternalProperty);
} else {
if (strcmp(key, "sun.java.command") == 0) {
char *old_java_command = _java_command;
@ -1248,7 +1274,7 @@ bool Arguments::add_property(const char* prop) {
}
// Create new property and add at the end of the list
PropertyList_unique_add(&_system_properties, key, value);
PropertyList_unique_add(&_system_properties, key, value, AddProperty, writeable, internal);
}
if (key != prop) {
@ -1260,9 +1286,9 @@ bool Arguments::add_property(const char* prop) {
return true;
}
// sets or adds a module name to the jdk.launcher.addmods property
// sets or adds a module name to the jdk.module.addmods property
bool Arguments::append_to_addmods_property(const char* module_name) {
const char* key = "jdk.launcher.addmods";
const char* key = "jdk.module.addmods";
const char* old_value = Arguments::get_property(key);
size_t buf_len = strlen(key) + strlen(module_name) + 2;
if (old_value != NULL) {
@ -1277,7 +1303,7 @@ bool Arguments::append_to_addmods_property(const char* module_name) {
} else {
jio_snprintf(new_value, buf_len, "%s=%s,%s", key, old_value, module_name);
}
bool added = add_property(new_value);
bool added = add_property(new_value, UnwriteableProperty, InternalProperty);
FreeHeap(new_value);
return added;
}
@ -1287,14 +1313,14 @@ void Arguments::check_unsupported_dumping_properties() {
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
const char* unsupported_properties[5] = { "jdk.module.main",
"jdk.module.path",
"jdk.upgrade.module.path",
"jdk.launcher.addmods",
"jdk.launcher.limitmods" };
"jdk.module.upgrade.path",
"jdk.module.addmods",
"jdk.module.limitmods" };
const char* unsupported_options[5] = { "-m",
"-modulepath",
"-upgrademodulepath",
"-addmods",
"-limitmods" };
"--module-path",
"--upgrade-module-path",
"--add-modules",
"--limit-modules" };
SystemProperty* sp = system_properties();
while (sp != NULL) {
for (int i = 0; i < 5; i++) {
@ -1326,7 +1352,7 @@ void Arguments::set_mode_flags(Mode mode) {
// Ensure Agent_OnLoad has the correct initial values.
// This may not be the final mode; mode may change later in onload phase.
PropertyList_unique_add(&_system_properties, "java.vm.info",
VM_Version::vm_info_string(), false);
VM_Version::vm_info_string(), AddProperty, UnwriteableProperty, ExternalProperty);
UseInterpreter = true;
UseCompiler = true;
@ -2516,6 +2542,41 @@ bool Arguments::parse_uintx(const char* value,
return false;
}
unsigned int addreads_count = 0;
unsigned int addexports_count = 0;
unsigned int patch_mod_count = 0;
const char* add_modules_value = NULL;
bool Arguments::create_property(const char* prop_name, const char* prop_value, PropertyInternal internal) {
size_t prop_len = strlen(prop_name) + strlen(prop_value) + 2;
char* property = AllocateHeap(prop_len, mtArguments);
int ret = jio_snprintf(property, prop_len, "%s=%s", prop_name, prop_value);
if (ret < 0 || ret >= (int)prop_len) {
FreeHeap(property);
return false;
}
bool added = add_property(property, UnwriteableProperty, internal);
FreeHeap(property);
return added;
}
bool Arguments::create_numbered_property(const char* prop_base_name, const char* prop_value, unsigned int count) {
// Make sure count is < 1,000. Otherwise, memory allocation will be too small.
if (count < 1000) {
size_t prop_len = strlen(prop_base_name) + strlen(prop_value) + 5;
char* property = AllocateHeap(prop_len, mtArguments);
int ret = jio_snprintf(property, prop_len, "%s.%d=%s", prop_base_name, count, prop_value);
if (ret < 0 || ret >= (int)prop_len) {
FreeHeap(property);
return false;
}
bool added = add_property(property, UnwriteableProperty, InternalProperty);
FreeHeap(property);
return added;
}
return false;
}
Arguments::ArgsRange Arguments::parse_memory_size(const char* s,
julong* long_arg,
julong min_size) {
@ -2528,7 +2589,7 @@ Arguments::ArgsRange Arguments::parse_memory_size(const char* s,
jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
const JavaVMInitArgs *java_options_args,
const JavaVMInitArgs *cmd_line_args) {
bool xpatch_javabase = false;
bool patch_mod_javabase = false;
// Save default settings for some mode flags
Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
@ -2545,20 +2606,20 @@ jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
// Parse args structure generated from JAVA_TOOL_OPTIONS environment
// variable (if present).
jint result = parse_each_vm_init_arg(java_tool_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
jint result = parse_each_vm_init_arg(java_tool_options_args, &patch_mod_javabase, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
// Parse args structure generated from the command line flags.
result = parse_each_vm_init_arg(cmd_line_args, &xpatch_javabase, Flag::COMMAND_LINE);
result = parse_each_vm_init_arg(cmd_line_args, &patch_mod_javabase, Flag::COMMAND_LINE);
if (result != JNI_OK) {
return result;
}
// Parse args structure generated from the _JAVA_OPTIONS environment
// variable (if present) (mimics classic VM)
result = parse_each_vm_init_arg(java_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
result = parse_each_vm_init_arg(java_options_args, &patch_mod_javabase, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
@ -2617,7 +2678,35 @@ bool valid_jdwp_agent(char *name, bool is_path) {
return false;
}
jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin) {
int Arguments::process_patch_mod_option(const char* patch_mod_tail, bool* patch_mod_javabase) {
// --patch-module=<module>=<file>(<pathsep><file>)*
assert(patch_mod_tail != NULL, "Unexpected NULL patch-module value");
// Find the equal sign between the module name and the path specification
const char* module_equal = strchr(patch_mod_tail, '=');
if (module_equal == NULL) {
jio_fprintf(defaultStream::output_stream(), "Missing '=' in --patch-module specification\n");
return JNI_ERR;
} else {
// Pick out the module name
size_t module_len = module_equal - patch_mod_tail;
char* module_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, module_len+1, mtArguments);
if (module_name != NULL) {
memcpy(module_name, patch_mod_tail, module_len);
*(module_name + module_len) = '\0';
// The path piece begins one past the module_equal sign
add_patch_mod_prefix(module_name, module_equal + 1, patch_mod_javabase);
FREE_C_HEAP_ARRAY(char, module_name);
if (!create_numbered_property("jdk.module.patch", patch_mod_tail, patch_mod_count++)) {
return JNI_ENOMEM;
}
} else {
return JNI_ENOMEM;
}
}
return JNI_OK;
}
jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_mod_javabase, Flag::Flags origin) {
// For match_option to return remaining or value part of option string
const char* tail;
@ -2701,6 +2790,34 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_
#endif // !INCLUDE_JVMTI
add_init_library(name, options);
}
} else if (match_option(option, "--add-reads=", &tail)) {
if (!create_numbered_property("jdk.module.addreads", tail, addreads_count++)) {
return JNI_ENOMEM;
}
} else if (match_option(option, "--add-exports=", &tail)) {
if (!create_numbered_property("jdk.module.addexports", tail, addexports_count++)) {
return JNI_ENOMEM;
}
} else if (match_option(option, "--add-modules=", &tail)) {
add_modules_value = tail;
} else if (match_option(option, "--limit-modules=", &tail)) {
if (!create_property("jdk.module.limitmods", tail, InternalProperty)) {
return JNI_ENOMEM;
}
} else if (match_option(option, "--module-path=", &tail)) {
if (!create_property("jdk.module.path", tail, ExternalProperty)) {
return JNI_ENOMEM;
}
} else if (match_option(option, "--upgrade-module-path=", &tail)) {
if (!create_property("jdk.module.upgrade.path", tail, ExternalProperty)) {
return JNI_ENOMEM;
}
} else if (match_option(option, "--patch-module=", &tail)) {
// --patch-module=<module>=<file>(<pathsep><file>)*
int res = process_patch_mod_option(tail, patch_mod_javabase);
if (res != JNI_OK) {
return res;
}
// -agentlib and -agentpath
} else if (match_option(option, "-agentlib:", &tail) ||
(is_absolute_path = match_option(option, "-agentpath:", &tail))) {
@ -2992,6 +3109,13 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_
"-Djava.ext.dirs=%s is not supported. Use -classpath instead.\n", value);
return JNI_EINVAL;
}
// Check for module related properties. They must be set using the modules
// options. For example: use "--add-modules=java.sql", not
// "-Djdk.module.addmods=java.sql"
if (is_internal_module_property(option->optionString + 2)) {
needs_module_property_warning = true;
continue;
}
if (!add_property(tail)) {
return JNI_ENOMEM;
@ -3012,33 +3136,6 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_
return JNI_ERR;
#endif
}
if (match_option(option, "-Djdk.launcher.patch.", &tail)) {
// -Djdk.launcher.patch.#=<module>=<file>(<pathsep><file>)*
// The number, #, specified will be increasing with each -Xpatch
// specified on the command line.
// Pick up module name, following the -D property's equal sign.
const char* property_equal = strchr(tail, '=');
if (property_equal == NULL) {
jio_fprintf(defaultStream::output_stream(), "Missing '=' in -Xpatch specification\n");
return JNI_ERR;
} else {
// Find the equal sign between the module name and the path specification
const char* module_equal = strchr(property_equal + 1, '=');
if (module_equal == NULL) {
jio_fprintf(defaultStream::output_stream(), "Bad value for -Xpatch, no module name specified\n");
return JNI_ERR;
} else {
// Pick out the module name, in between the two equal signs
size_t module_len = module_equal - property_equal - 1;
char* module_name = NEW_C_HEAP_ARRAY(char, module_len+1, mtArguments);
memcpy(module_name, property_equal + 1, module_len);
*(module_name + module_len) = '\0';
// The path piece begins one past the module_equal sign
Arguments::add_xpatchprefix(module_name, module_equal + 1, xpatch_javabase);
FREE_C_HEAP_ARRAY(char, module_name);
}
}
}
// -Xint
} else if (match_option(option, "-Xint")) {
set_mode_flags(_int);
@ -3298,25 +3395,25 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_
return JNI_OK;
}
void Arguments::add_xpatchprefix(const char* module_name, const char* path, bool* xpatch_javabase) {
// For java.base check for duplicate -Xpatch options being specified on the command line.
void Arguments::add_patch_mod_prefix(const char* module_name, const char* path, bool* patch_mod_javabase) {
// For java.base check for duplicate --patch-module options being specified on the command line.
// This check is only required for java.base, all other duplicate module specifications
// will be checked during module system initialization. The module system initialization
// will throw an ExceptionInInitializerError if this situation occurs.
if (strcmp(module_name, "java.base") == 0) {
if (*xpatch_javabase) {
vm_exit_during_initialization("Cannot specify java.base more than once to -Xpatch");
if (*patch_mod_javabase) {
vm_exit_during_initialization("Cannot specify java.base more than once to --patch-module");
} else {
*xpatch_javabase = true;
*patch_mod_javabase = true;
}
}
// Create GrowableArray lazily, only if -Xpatch has been specified
if (_xpatchprefix == NULL) {
_xpatchprefix = new (ResourceObj::C_HEAP, mtArguments) GrowableArray<ModuleXPatchPath*>(10, true);
// Create GrowableArray lazily, only if --patch-module has been specified
if (_patch_mod_prefix == NULL) {
_patch_mod_prefix = new (ResourceObj::C_HEAP, mtArguments) GrowableArray<ModulePatchPath*>(10, true);
}
_xpatchprefix->push(new ModuleXPatchPath(module_name, path));
_patch_mod_prefix->push(new ModulePatchPath(module_name, path));
}
// Remove all empty paths from the app classpath (if IgnoreEmptyClassPaths is enabled)
@ -3441,6 +3538,15 @@ jint Arguments::finalize_vm_init_args() {
return JNI_ERR;
}
// Append the value of the last --add-modules option specified on the command line.
// This needs to be done here, to prevent overwriting possible values written
// to the jdk.module.addmods property by -javaagent and other options.
if (add_modules_value != NULL) {
if (!append_to_addmods_property(add_modules_value)) {
return JNI_ENOMEM;
}
}
// This must be done after all arguments have been processed.
// java_compiler() true means set to "NONE" or empty.
if (java_compiler() && !xdebug_mode()) {
@ -3795,9 +3901,9 @@ jint Arguments::parse_options_buffer(const char* name, char* buffer, const size_
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
if (Arguments::get_xpatchprefix() != NULL) {
if (Arguments::get_patch_mod_prefix() != NULL) {
vm_exit_during_initialization(
"Cannot use the following option when dumping the shared archive", "-Xpatch");
"Cannot use the following option when dumping the shared archive: --patch-module");
}
if (RequireSharedSpaces) {
@ -4180,6 +4286,11 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
hotspotrc, hotspotrc);
}
if (needs_module_property_warning) {
warning("Ignoring system property options whose names start with '-Djdk.module'."
" They are reserved for internal use.");
}
#if defined(_ALLBSD_SOURCE) || defined(AIX) // UseLargePages is not yet supported on BSD and AIX.
UNSUPPORTED_OPTION(UseLargePages);
#endif
@ -4404,6 +4515,18 @@ int Arguments::PropertyList_count(SystemProperty* pl) {
return count;
}
// Return the number of readable properties.
int Arguments::PropertyList_readable_count(SystemProperty* pl) {
int count = 0;
while(pl != NULL) {
if (pl->is_readable()) {
count++;
}
pl = pl->next();
}
return count;
}
const char* Arguments::PropertyList_get_value(SystemProperty *pl, const char* key) {
assert(key != NULL, "just checking");
SystemProperty* prop;
@ -4413,6 +4536,27 @@ const char* Arguments::PropertyList_get_value(SystemProperty *pl, const char* ke
return NULL;
}
// Return the value of the requested property provided that it is a readable property.
const char* Arguments::PropertyList_get_readable_value(SystemProperty *pl, const char* key) {
assert(key != NULL, "just checking");
SystemProperty* prop;
// Return the property value if the keys match and the property is not internal or
// it's the special internal property "jdk.boot.class.path.append".
for (prop = pl; prop != NULL; prop = prop->next()) {
if (strcmp(key, prop->key()) == 0) {
if (!prop->internal()) {
return prop->value();
} else if (strcmp(key, "jdk.boot.class.path.append") == 0) {
return prop->value();
} else {
// Property is internal and not jdk.boot.class.path.append so return NULL.
return NULL;
}
}
}
return NULL;
}
const char* Arguments::PropertyList_get_key_at(SystemProperty *pl, int index) {
int count = 0;
const char* ret_val = NULL;
@ -4457,11 +4601,12 @@ void Arguments::PropertyList_add(SystemProperty** plist, SystemProperty *new_p)
}
}
void Arguments::PropertyList_add(SystemProperty** plist, const char* k, const char* v) {
void Arguments::PropertyList_add(SystemProperty** plist, const char* k, const char* v,
bool writeable, bool internal) {
if (plist == NULL)
return;
SystemProperty* new_p = new SystemProperty(k, v, true);
SystemProperty* new_p = new SystemProperty(k, v, writeable, internal);
PropertyList_add(plist, new_p);
}
@ -4470,7 +4615,9 @@ void Arguments::PropertyList_add(SystemProperty *element) {
}
// This add maintains unique property key in the list.
void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v, jboolean append) {
void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v,
PropertyAppendable append, PropertyWriteable writeable,
PropertyInternal internal) {
if (plist == NULL)
return;
@ -4478,16 +4625,16 @@ void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, c
SystemProperty* prop;
for (prop = *plist; prop != NULL; prop = prop->next()) {
if (strcmp(k, prop->key()) == 0) {
if (append) {
if (append == AppendProperty) {
prop->append_value(v);
} else {
prop->set_writeable_value(v);
prop->set_value(v);
}
return;
}
}
PropertyList_add(plist, k, v);
PropertyList_add(plist, k, v, writeable == WriteableProperty, internal == InternalProperty);
}
// Copies src into buf, replacing "%%" with "%" and "%p" with pid

View File

@ -43,7 +43,7 @@ extern "C" {
// PathString is used as:
// - the underlying value for a SystemProperty
// - the path portion of an -Xpatch module/path pair
// - the path portion of an --patch-module module/path pair
// - the string that represents the system boot class path, Arguments::_system_boot_class_path.
class PathString : public CHeapObj<mtArguments> {
protected:
@ -107,13 +107,13 @@ class PathString : public CHeapObj<mtArguments> {
}
};
// ModuleXPatchPath records the module/path pair as specified to -Xpatch.
class ModuleXPatchPath : public CHeapObj<mtInternal> {
// ModulePatchPath records the module/path pair as specified to --patch-module.
class ModulePatchPath : public CHeapObj<mtInternal> {
private:
char* _module_name;
PathString* _path;
public:
ModuleXPatchPath(const char* module_name, const char* path) {
ModulePatchPath(const char* module_name, const char* path) {
assert(module_name != NULL && path != NULL, "Invalid module name or path value");
size_t len = strlen(module_name) + 1;
_module_name = AllocateHeap(len, mtInternal);
@ -121,7 +121,7 @@ public:
_path = new PathString(path);
}
~ModuleXPatchPath() {
~ModulePatchPath() {
if (_module_name != NULL) {
FreeHeap(_module_name);
_module_name = NULL;
@ -158,6 +158,10 @@ class SystemProperty : public PathString {
SystemProperty* next() const { return _next; }
void set_next(SystemProperty* next) { _next = next; }
bool is_readable() const {
return !_internal || strcmp(_key, "jdk.boot.class.path.append") == 0;
}
// A system property should only have its value set
// via an external interface if it is a writeable property.
// The internal, non-writeable property jdk.boot.class.path.append
@ -325,6 +329,21 @@ class Arguments : AllStatic {
arg_in_range = 0
};
enum PropertyAppendable {
AppendProperty,
AddProperty
};
enum PropertyWriteable {
WriteableProperty,
UnwriteableProperty
};
enum PropertyInternal {
InternalProperty,
ExternalProperty
};
private:
// a pointer to the flags file name if it is specified
@ -348,18 +367,18 @@ class Arguments : AllStatic {
static SystemProperty *_java_class_path;
static SystemProperty *_jdk_boot_class_path_append;
// -Xpatch:module=<file>(<pathsep><file>)*
// --patch-module=module=<file>(<pathsep><file>)*
// Each element contains the associated module name, path
// string pair as specified to -Xpatch.
static GrowableArray<ModuleXPatchPath*>* _xpatchprefix;
// string pair as specified to --patch-module.
static GrowableArray<ModulePatchPath*>* _patch_mod_prefix;
// The constructed value of the system class path after
// argument processing and JVMTI OnLoad additions via
// calls to AddToBootstrapClassLoaderSearch. This is the
// final form before ClassLoader::setup_bootstrap_search().
// Note: since -Xpatch is a module name/path pair, the system
// boot class path string no longer contains the "prefix" to
// the boot class path base piece as it did when
// Note: since --patch-module is a module name/path pair, the
// system boot class path string no longer contains the "prefix"
// to the boot class path base piece as it did when
// -Xbootclasspath/p was supported.
static PathString *_system_boot_class_path;
@ -462,7 +481,13 @@ class Arguments : AllStatic {
static vfprintf_hook_t _vfprintf_hook;
// System properties
static bool add_property(const char* prop);
static bool add_property(const char* prop, PropertyWriteable writeable=WriteableProperty,
PropertyInternal internal=ExternalProperty);
static bool create_property(const char* prop_name, const char* prop_value, PropertyInternal internal);
static bool create_numbered_property(const char* prop_base_name, const char* prop_value, unsigned int count);
static int process_patch_mod_option(const char* patch_mod_tail, bool* patch_mod_javabase);
// Miscellaneous system property setter
static bool append_to_addmods_property(const char* module_name);
@ -500,7 +525,7 @@ class Arguments : AllStatic {
static jint parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
const JavaVMInitArgs *java_options_args,
const JavaVMInitArgs *cmd_line_args);
static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin);
static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_mod_javabase, Flag::Flags origin);
static jint finalize_vm_init_args();
static bool is_bad_option(const JavaVMOption* option, jboolean ignore, const char* option_type);
@ -708,16 +733,20 @@ class Arguments : AllStatic {
// Property List manipulation
static void PropertyList_add(SystemProperty *element);
static void PropertyList_add(SystemProperty** plist, SystemProperty *element);
static void PropertyList_add(SystemProperty** plist, const char* k, const char* v);
static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v) {
PropertyList_unique_add(plist, k, v, false);
}
static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v, jboolean append);
static void PropertyList_add(SystemProperty** plist, const char* k, const char* v, bool writeable, bool internal);
static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v,
PropertyAppendable append, PropertyWriteable writeable,
PropertyInternal internal);
static const char* PropertyList_get_value(SystemProperty* plist, const char* key);
static const char* PropertyList_get_readable_value(SystemProperty* plist, const char* key);
static int PropertyList_count(SystemProperty* pl);
static int PropertyList_readable_count(SystemProperty* pl);
static const char* PropertyList_get_key_at(SystemProperty* pl,int index);
static char* PropertyList_get_value_at(SystemProperty* pl,int index);
static bool is_internal_module_property(const char* option);
// Miscellaneous System property value getter and setters.
static void set_dll_dir(const char *value) { _sun_boot_library_path->set_value(value); }
static void set_java_home(const char *value) { _java_home->set_value(value); }
@ -725,7 +754,7 @@ class Arguments : AllStatic {
static void set_ext_dirs(char *value) { _ext_dirs = os::strdup_check_oom(value); }
// Set up the underlying pieces of the system boot class path
static void add_xpatchprefix(const char *module_name, const char *path, bool* xpatch_javabase);
static void add_patch_mod_prefix(const char *module_name, const char *path, bool* patch_mod_javabase);
static void set_sysclasspath(const char *value, bool has_jimage) {
// During start up, set by os::set_boot_path()
assert(get_sysclasspath() == NULL, "System boot class path previously set");
@ -737,7 +766,7 @@ class Arguments : AllStatic {
_jdk_boot_class_path_append->append_value(value);
}
static GrowableArray<ModuleXPatchPath*>* get_xpatchprefix() { return _xpatchprefix; }
static GrowableArray<ModulePatchPath*>* get_patch_mod_prefix() { return _patch_mod_prefix; }
static char* get_sysclasspath() { return _system_boot_class_path->value(); }
static char* get_jdk_boot_class_path_append() { return _jdk_boot_class_path_append->value(); }
static bool has_jimage() { return _has_jimage; }

View File

@ -703,13 +703,15 @@ void defaultStream::start_log() {
// System properties don't generally contain newlines, so don't bother with unparsing.
outputStream *text = xs->text();
for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
// Print in two stages to avoid problems with long
// keys/values.
assert(p->key() != NULL, "p->key() is NULL");
text->print_raw(p->key());
text->put('=');
assert(p->value() != NULL, "p->value() is NULL");
text->print_raw_cr(p->value());
if (p->is_readable()) {
// Print in two stages to avoid problems with long
// keys/values.
text->print_raw(p->key());
text->put('=');
assert(p->value() != NULL, "p->value() is NULL");
text->print_raw_cr(p->value());
}
}
xs->tail("properties");
}

View File

@ -46,12 +46,12 @@ requires.properties= \
vm.gc.Parallel \
vm.gc.ConcMarkSweep
# Tests using jtreg 4.2 b02 features
requiredVersion=4.2 b02
# Tests using jtreg 4.2 b03 features
requiredVersion=4.2 b03
# Path to libraries in the topmost test directory. This is needed so @library
# does not need ../../ notation to reach them
external.lib.roots = ../../
# Use new form of -Xpatch
useNewXpatch=true
# Use new module options
useNewOptions=true

View File

@ -40,7 +40,7 @@
* -XX:CompileCommand=dontinline,compiler.unsafe.UnsafeGetConstantField::checkGetAddress
* -XX:CompileCommand=dontinline,*::test*
* -XX:+UseUnalignedAccesses
* -XaddReads:java.base=ALL-UNNAMED
* --add-reads=java.base=ALL-UNNAMED
* compiler.unsafe.UnsafeGetConstantField
*
* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions
@ -50,7 +50,7 @@
* -XX:CompileCommand=dontinline,*::test*
* -XX:CompileCommand=inline,*Unsafe::get*
* -XX:-UseUnalignedAccesses
* -XaddReads:java.base=ALL-UNNAMED
* --add-reads=java.base=ALL-UNNAMED
* compiler.unsafe.UnsafeGetConstantField
*/

View File

@ -88,7 +88,7 @@ public class TestMaxMinHeapFreeRatioFlags {
(useXmaxf ? "-Xmaxf" + maxRatio / 100.0 : "-XX:MaxHeapFreeRatio=" + maxRatio),
"-Xmx" + MAX_HEAP_SIZE,
"-Xms" + HEAP_SIZE,
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:NewSize=" + NEW_SIZE,
"-XX:MaxNewSize=" + MAX_NEW_SIZE,
"-XX:" + (shrinkHeapInSteps ? '+' : '-') + "ShrinkHeapInSteps",
@ -120,7 +120,7 @@ public class TestMaxMinHeapFreeRatioFlags {
Collections.addAll(vmOptions,
(useXminf ? "-Xminf" + minRatio / 100.0 : "-XX:MinHeapFreeRatio=" + minRatio),
(useXmaxf ? "-Xmaxf" + maxRatio / 100.0 : "-XX:MaxHeapFreeRatio=" + maxRatio),
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-version"
);
ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(vmOptions.toArray(new String[vmOptions.size()]));

View File

@ -74,7 +74,7 @@ public class TestSurvivorRatioFlag {
Collections.addAll(vmOptions,
"-Xbootclasspath/a:.",
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:GCLockerEdenExpansionPercent=0",

View File

@ -132,7 +132,7 @@ public class TestTargetSurvivorRatioFlag {
LinkedList<String> vmOptions = new LinkedList<>(options);
Collections.addAll(vmOptions,
"-Xbootclasspath/a:.",
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:+UseAdaptiveSizePolicy",

View File

@ -53,7 +53,7 @@ public class TestShrinkAuxiliaryData {
"-Xlog:gc=debug",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-Xbootclasspath/a:.",
};

View File

@ -48,7 +48,7 @@ public class BootstrapRedefine {
"-Xmodule:java.base"),
"mods/java.base");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base", "-version");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.base=mods/java.base", "-version");
new OutputAnalyzer(pb.start())
.shouldContain("Incompatible definition of java.lang.Object")
.shouldHaveExitValue(1);

View File

@ -27,7 +27,7 @@ import java.io.File;
* @test
* @build BootClassPathAppendProp
* @run main/othervm -Xbootclasspath/a:/usr/lib -showversion -Xbootclasspath/a:/i/dont/exist BootClassPathAppendProp
* @run main/othervm -Xpatch:/not/here -Xbootclasspath/a:/i/may/exist BootClassPathAppendProp
* @run main/othervm --patch-module=no_module=/not/here -Xbootclasspath/a:/i/may/exist BootClassPathAppendProp
* @run main/othervm -Djdk.boot.class.path.append=newdir BootClassPathAppendProp
* @run main/othervm BootClassPathAppendProp
*/

View File

@ -56,7 +56,7 @@ public class CreateCoredumpOnCrash {
public static OutputAnalyzer runTest(String option) throws Exception {
return new OutputAnalyzer(
ProcessTools.createJavaProcessBuilder(
"-Xmx64m", "-XX:-TransmitErrorReport", "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", option, Crasher.class.getName())
"-Xmx64m", "-XX:-TransmitErrorReport", "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", option, Crasher.class.getName())
.start());
}
}

View File

@ -48,7 +48,7 @@ public class ProblematicFrameTest {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xmx64m", "-XX:-TransmitErrorReport", "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", "-XX:-CreateCoredumpOnCrash", Crasher.class.getName());
"-Xmx64m", "-XX:-TransmitErrorReport", "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", "-XX:-CreateCoredumpOnCrash", Crasher.class.getName());
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldNotContain("Exception in thread");
output.shouldNotMatch("error occurred during error reporting \\(printing problematic frame\\)");

View File

@ -160,10 +160,10 @@ public class BootAppendTests {
// Test #3: If a class on -Xbootclasspath/a is from a package defined in boot modules,
// the class can be loaded from -Xbootclasspath/a when the module is excluded
// using -limitmods. Verify the behavior is the same at runtime when CDS is
// enabled.
// using --limit-modules. Verify the behavior is the same at runtime when CDS
// is enabled.
//
// The java.desktop module is excluded using -limitmods at runtime,
// The java.desktop module is excluded using --limit-modules at runtime,
// javax.sound.sampled.MyClass is archived from -Xbootclasspath/a. It can be
// loaded from the archive at runtime.
public static void testBootAppendExcludedModuleClass() throws Exception {
@ -174,7 +174,7 @@ public class BootAppendTests {
"-XX:+TraceClassLoading",
"-cp", appJar,
"-Xbootclasspath/a:" + bootAppendJar,
"-limitmods", "java.base",
"--limit-modules=java.base",
"-Xshare:" + mode,
APP_CLASS,
BOOT_APPEND_MODULE_CLASS_NAME);
@ -191,8 +191,8 @@ public class BootAppendTests {
// Test #4: If a class on -Xbootclasspath/a has the same fully qualified
// name as a class defined in boot modules, the class is loaded
// from -Xbootclasspath/a when the boot module is excluded using
// -limitmods. Verify the behavior is the same at runtime when CDS is
// enabled.
// --limit-modules. Verify the behavior is the same at runtime
// when CDS is enabled.
//
// The org.omg.CORBA.Context is a boot module class. The class
// on -Xbootclasspath/a that has the same fully-qualified name
@ -206,7 +206,7 @@ public class BootAppendTests {
"-XX:+TraceClassLoading",
"-cp", appJar,
"-Xbootclasspath/a:" + bootAppendJar,
"-limitmods", "java.base",
"--limit-modules=java.base",
"-Xshare:" + mode,
APP_CLASS,
BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);

View File

@ -89,10 +89,11 @@ public class SASymbolTableTest {
long pid = p.getPid();
System.out.println("Attaching agent " + pid);
ProcessBuilder tool = ProcessTools.createJavaProcessBuilder(
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED",
"--add-modules=jdk.hotspot.agent",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED",
"SASymbolTableTestAgent",
Long.toString(pid));
OutputAnalyzer output = ProcessTools.executeProcess(tool);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2016, 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
@ -44,7 +44,7 @@ public class RangeCheck {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
true,
"-Xmx32m",
"-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:-TransmitErrorReport",
"-XX:-CreateCoredumpOnCrash",
"-XX:-InlineUnsafeOps", // The compiler intrinsics doesn't have the assert

View File

@ -98,7 +98,7 @@ public class GetSysPkgTest {
ClassFileInstaller.writeClassToDisk("GetSysPkg_package/GetSysClass", klassbuf);
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:bl_dir",
"-XaddExports:java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator +
"--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator +
System.getProperty("test.classes"), "GetSysPkgTest", "do_tests");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);

View File

@ -0,0 +1,75 @@
/*
* Copyright (c) 2016, 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.
*
* 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.
*/
/*
* @test
* @bug 8136930
* @summary Test that the VM ignores explicitly specified module internal properties.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
*/
import jdk.test.lib.*;
// Test that the VM ignores module related properties such as "jdk.module.addmods"
// and jdk.module.addreads.0" that can only be set using module options.
public class IgnoreModulePropertiesTest {
// Test that the specified property and its value are ignored. If the VM accepted
// the property and value then an exception would be thrown because the value is
// bogus for that property. But, since the property is ignored no exception is
// thrown.
public static void testProperty(String prop, String value) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-D" + prop + "=" + value, "-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("java version ");
output.shouldHaveExitValue(0);
// Ensure that the property and its value aren't available.
if (System.getProperty(prop) != null) {
throw new RuntimeException(
"Unexpected non-null value for property " + prop);
}
}
// For options of the form "option=value", check that an exception gets thrown for
// the illegal value and then check that its corresponding property is handled
// correctly.
public static void testOption(String option, String value,
String prop, String result) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
option + "=" + value, "-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain(result);
testProperty(prop, value);
}
public static void main(String[] args) throws Exception {
testOption("--add-modules", "java.sqlx", "jdk.module.addmods", "java.lang.module.ResolutionException");
testOption("--limit-modules", "java.sqlx", "jdk.module.limitmods", "java.lang.module.ResolutionException");
testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "java.lang.RuntimeException");
testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0", "java.lang.RuntimeException");
testOption("--patch-module", "=d", "jdk.module.patch.0", "IllegalArgumentException");
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 2016, 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.
*
* 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.
*/
/*
* @test
* @bug 8136930
* @summary Test that the VM only recognizes the last specified --add-modules
* and --list-modules options
* @modules java.base/jdk.internal.misc
* @library /testlibrary
*/
import jdk.test.lib.*;
// Test that the VM behaves correctly when processing module related options.
public class ModuleOptionsTest {
public static void main(String[] args) throws Exception {
// Test that last --add-modules is the only one recognized. No exception
// should be thrown.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"--add-modules=i_dont_exist", "--add-modules=java.base", "-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
// Test that last --limit-modules is the only one recognized. No exception
// should be thrown.
pb = ProcessTools.createJavaProcessBuilder(
"--limit-modules=i_dont_exist", "--limit-modules=java.base", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2016, 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.
*
* 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.
*/
/*
* @test
* @bug 8162415
* @summary Test warnings for ignored properties.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
*/
import jdk.test.lib.*;
// Test that the VM behaves correctly when processing command line module system properties.
public class ModuleOptionsWarn {
public static void main(String[] args) throws Exception {
// Test that a warning is issued for module related properties that get ignored.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+PrintWarnings", "-Djdk.module.ignored", "-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("Ignoring system property option");
output.shouldHaveExitValue(0);
// Test that a warning can be suppressed for module related properties that get ignored.
pb = ProcessTools.createJavaProcessBuilder(
"-Djdk.module.ignored", "-XX:-PrintWarnings", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotContain("Ignoring system property option");
output.shouldHaveExitValue(0);
// Test that a warning is not issued for properties of the form "jdk.module.main"
pb = ProcessTools.createJavaProcessBuilder(
"-XX:+PrintWarnings", "-Djdk.module.main.ignored", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotContain("Ignoring system property option");
output.shouldHaveExitValue(0);
}
}

View File

@ -62,8 +62,8 @@ public class ExportModuleStressTest {
compiled = CompilerUtils.compile(
SRC_DIR.resolve("jdk.translet"),
MODS_DIR.resolve("jdk.translet"),
"-XaddExports:jdk.test/test=jdk.translet",
"-mp", MODS_DIR.toString());
"--add-exports=jdk.test/test=jdk.translet",
"-p", MODS_DIR.toString());
if (!compiled) {
throw new RuntimeException("Test failed to compile module jdk.translet");
}
@ -71,7 +71,7 @@ public class ExportModuleStressTest {
// Sanity check that the test, jdk.test/test/Main.java
// runs without error.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-mp", MODS_DIR.toString(),
"-p", MODS_DIR.toString(),
"-m", "jdk.test/test.Main");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("failed: 0")

View File

@ -62,8 +62,8 @@ public class ModuleStressGC {
compiled = CompilerUtils.compile(
SRC_DIR.resolve("jdk.translet"),
MODS_DIR.resolve("jdk.translet"),
"-XaddExports:jdk.test/test=jdk.translet",
"-mp", MODS_DIR.toString());
"--add-exports=jdk.test/test=jdk.translet",
"-p", MODS_DIR.toString());
if (!compiled) {
throw new RuntimeException("Test failed to compile module jdk.translet");
}
@ -74,7 +74,7 @@ public class ModuleStressGC {
// GC safepoints.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xlog:modules=trace",
"-mp", MODS_DIR.toString(),
"-p", MODS_DIR.toString(),
"-m", "jdk.test/test.MainGC");
OutputAnalyzer oa = new OutputAnalyzer(pb.start());
oa.shouldContain("package test defined in module jdk.test, exports list being walked")

View File

@ -23,17 +23,17 @@
/*
* @test
* @summary Make sure -Xpatch works with multiple directories.
* @summary Make sure --patch-module works with multiple directories.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
* @compile Xpatch2DirsMain.java
* @run main Xpatch2Dirs
* @compile PatchModule2DirsMain.java
* @run main PatchModule2Dirs
*/
import jdk.test.lib.*;
import java.io.File;
public class Xpatch2Dirs {
public class PatchModule2Dirs {
public static void main(String[] args) throws Exception {
String source1 = "package javax.naming.spi; " +
@ -58,9 +58,9 @@ public class Xpatch2Dirs {
"mods2/java.desktop");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xpatch:java.naming=mods/java.naming",
"-Xpatch:java.desktop=mods2/java.desktop",
"Xpatch2DirsMain", "javax.naming.spi.NamingManager", "java.beans.Encoder");
"--patch-module=java.naming=mods/java.naming",
"--patch-module=java.desktop=mods2/java.desktop",
"PatchModule2DirsMain", "javax.naming.spi.NamingManager", "java.beans.Encoder");
OutputAnalyzer oa = new OutputAnalyzer(pb.start());
oa.shouldContain("I pass one!");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 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
@ -21,9 +21,9 @@
* questions.
*/
// This loads the class affected by the -Xpatch option. For the test to pass
// it must load both classes from the -Xpatch directory, not the jimage file.
public class Xpatch2DirsMain {
// This loads the class affected by the --patch-module option. For the test to pass
// it must load both classes from the --patch-module directory, not the jimage file.
public class PatchModule2DirsMain {
public static void main(String[] args) throws Exception {
Class.forName(args[0]);
Class.forName(args[1]);

View File

@ -25,22 +25,22 @@
* @test
* @library /testlibrary
* @modules java.base/jdk.internal.misc
* @run main XpatchCDS
* @run main PatchModuleCDS
*/
import java.io.File;
import jdk.test.lib.*;
public class XpatchCDS {
public class PatchModuleCDS {
public static void main(String args[]) throws Throwable {
System.out.println("Test that -Xpatch and -Xshare:dump are incompatibable");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming", "-Xshare:dump");
System.out.println("Test that --patch-module and -Xshare:dump are incompatibable");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming", "-Xshare:dump");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("Cannot use the following option when dumping the shared archive: -Xpatch");
output.shouldContain("Cannot use the following option when dumping the shared archive: --patch-module");
System.out.println("Test that -Xpatch and -Xshare:on are incompatibable");
String filename = "Xpatch.jsa";
System.out.println("Test that --patch-module and -Xshare:on are incompatibable");
String filename = "patch_module.jsa";
pb = ProcessTools.createJavaProcessBuilder(
"-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=" + filename,
@ -52,10 +52,10 @@ public class XpatchCDS {
"-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=" + filename,
"-Xshare:on",
"-Xpatch:java.naming=mods/java.naming",
"--patch-module=java.naming=mods/java.naming",
"-version");
output = new OutputAnalyzer(pb.start());
output.shouldContain("The shared archive file cannot be used with -Xpatch");
output.shouldContain("The shared archive file cannot be used with --patch-module");
output.shouldHaveExitValue(1);
}

View File

@ -23,23 +23,23 @@
/*
* @test
* @summary VM exit initialization results if java.base is specificed more than once to Xpatch.
* @summary VM exit initialization results if java.base is specificed more than once to --patch-module.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
*/
import jdk.test.lib.*;
public class XpatchDupJavaBase {
public class PatchModuleDupJavaBase {
// The VM should exit initialization if java.base is specified
// more than once to -Xpatch.
// more than once to --patch-module.
public static void main(String args[]) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xpatch:java.base=javabase_dir",
"-Xpatch:java.base=javabase_dir",
"--patch-module=java.base=javabase_dir",
"--patch-module=java.base=javabase_dir",
"-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("Cannot specify java.base more than once to -Xpatch");
output.shouldContain("Cannot specify java.base more than once to --patch-module");
output.shouldHaveExitValue(1);
}
}

View File

@ -23,26 +23,25 @@
/*
* @test
* @summary Module system initialization exception results if a module is specificed twice to Xpatch.
* @summary Module system initialization exception results if a module is specificed twice to --patch-module.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
*/
import jdk.test.lib.*;
public class XpatchDupModule {
public class PatchModuleDupModule {
// The module system initialization should generate an ExceptionInInitializerError
// if -Xpatch is specified with the same module more than once.
// if --patch-module is specified with the same module more than once.
public static void main(String args[]) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xpatch:module1=module1_dir",
"-Xpatch:module1=module1_dir",
"--patch-module=module1=module1_dir",
"--patch-module=module1=module1_dir",
"-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("java.lang.ExceptionInInitializerError");
output.shouldHaveExitValue(1);
}
}

View File

@ -24,16 +24,16 @@
/*
* @test
* @bug 8130399
* @summary Make sure -Xpatch works for java.base.
* @summary Make sure --patch-module works for java.base.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
* @compile XpatchMain.java
* @run main XpatchJavaBase
* @compile PatchModuleMain.java
* @run main PatchModuleJavaBase
*/
import jdk.test.lib.*;
public class XpatchJavaBase {
public class PatchModuleJavaBase {
public static void main(String[] args) throws Exception {
String source = "package java.lang; " +
@ -47,8 +47,8 @@ public class XpatchJavaBase {
InMemoryJavaCompiler.compile("java.lang.NewClass", source, "-Xmodule:java.base"),
"mods/java.base");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base",
"XpatchMain", "java.lang.NewClass");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.base=mods/java.base",
"PatchModuleMain", "java.lang.NewClass");
new OutputAnalyzer(pb.start())
.shouldContain("I pass!")

View File

@ -21,9 +21,9 @@
* questions.
*/
// This loads the class affected by the -Xpatch option. For the test to pass
// it must load the class from the -Xpatch directory, not the jimage file.
public class XpatchMain {
// This loads the class affected by the --patch-module option. For the test to pass
// it must load the class from the --patch-module directory, not the jimage file.
public class PatchModuleMain {
public static void main(String[] args) throws Exception {
Class.forName(args[0]);
}

View File

@ -24,16 +24,16 @@
/*
* @test
* @bug 8130399
* @summary Make sure -Xpatch works for modules besides java.base.
* @summary Make sure --patch-module works for modules besides java.base.
* @modules java.base/jdk.internal.misc
* @library /testlibrary
* @compile XpatchMain.java
* @run main XpatchTest
* @compile PatchModuleMain.java
* @run main PatchModuleTest
*/
import jdk.test.lib.*;
public class XpatchTest {
public class PatchModuleTest {
public static void main(String[] args) throws Exception {
String source = "package javax.naming.spi; " +
@ -47,8 +47,8 @@ public class XpatchTest {
InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
"mods/java.naming");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
"XpatchMain", "javax.naming.spi.NamingManager");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming",
"PatchModuleMain", "javax.naming.spi.NamingManager");
new OutputAnalyzer(pb.start())
.shouldContain("I pass!")

View File

@ -23,18 +23,18 @@
/*
* @test
* @summary Make sure -Xpatch works when a jar file is specified for a module
* @summary Make sure --patch-module works when a jar file is specified for a module
* @library /testlibrary
* @modules java.base/jdk.internal.misc
* jdk.jartool/sun.tools.jar
* @build BasicJarBuilder
* @compile XpatchMain.java
* @run main XpatchTestJar
* @compile PatchModuleMain.java
* @run main PatchModuleTestJar
*/
import jdk.test.lib.*;
public class XpatchTestJar {
public class PatchModuleTestJar {
private static String moduleJar;
public static void main(String[] args) throws Exception {
@ -72,9 +72,9 @@ public class XpatchTestJar {
InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
System.getProperty("test.classes"));
// Supply -Xpatch with the name of the jar file for the module java.naming.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" + moduleJar,
"XpatchMain", "javax.naming.spi.NamingManager");
// Supply --patch-module with the name of the jar file for the module java.naming.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=" + moduleJar,
"PatchModuleMain", "javax.naming.spi.NamingManager");
new OutputAnalyzer(pb.start())
.shouldContain("I pass!")

View File

@ -23,20 +23,20 @@
/*
* @test
* @summary Make sure -Xpatch works when a jar file and a directory is specified for a module
* @summary Make sure --patch-module works when a jar file and a directory is specified for a module
* @library /testlibrary
* @modules java.base/jdk.internal.misc
* jdk.jartool/sun.tools.jar
* @build BasicJarBuilder
* @compile Xpatch2DirsMain.java
* @run main XpatchTestJarDir
* @compile PatchModule2DirsMain.java
* @run main PatchModuleTestJarDir
*/
import java.io.File;
import java.nio.file.Files;
import jdk.test.lib.*;
public class XpatchTestJarDir {
public class PatchModuleTestJarDir {
private static String moduleJar;
public static void main(String[] args) throws Exception {
@ -88,12 +88,12 @@ public class XpatchTestJarDir {
(System.getProperty("test.classes") + "/mods/java.naming"));
// Supply -Xpatch with the name of the jar file for the module java.naming.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" +
// Supply --patch-module with the name of the jar file for the module java.naming.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=" +
moduleJar +
File.pathSeparator +
System.getProperty("test.classes") + "/mods/java.naming",
"Xpatch2DirsMain",
"PatchModule2DirsMain",
"javax.naming.spi.NamingManager1",
"javax.naming.spi.NamingManager2");

View File

@ -25,17 +25,17 @@
* @test
* @bug 8069469
* @summary Make sure -Xlog:classload=info works properly with "modules" jimage,
-Xpatch, and with -Xbootclasspath/a
--patch-module, and with -Xbootclasspath/a
* @modules java.base/jdk.internal.misc
* @library /testlibrary
* @compile XpatchMain.java
* @run main XpatchTraceCL
* @compile PatchModuleMain.java
* @run main PatchModuleTraceCL
*/
import java.io.File;
import jdk.test.lib.*;
public class XpatchTraceCL {
public class PatchModuleTraceCL {
public static void main(String[] args) throws Exception {
String source = "package javax.naming.spi; " +
@ -45,39 +45,39 @@ public class XpatchTraceCL {
" } " +
"}";
// Test -Xlog:classload=info output for -Xpatch
// Test -Xlog:classload=info output for --patch-module
ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
"mods/java.naming");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
"-Xlog:class+load=info", "XpatchMain", "javax.naming.spi.NamingManager");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming",
"-Xlog:class+load=info", "PatchModuleMain", "javax.naming.spi.NamingManager");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
// "modules" jimage case.
output.shouldContain("[class,load] java.lang.Thread source: jrt:/java.base");
// -Xpatch case.
// --patch-module case.
output.shouldContain("[class,load] javax.naming.spi.NamingManager source: mods/java.naming");
// -cp case.
output.shouldContain("[class,load] XpatchMain source: file");
output.shouldContain("[class,load] PatchModuleMain source: file");
// Test -Xlog:classload=info output for -Xbootclasspath/a
source = "package XpatchTraceCL_pkg; " +
source = "package PatchModuleTraceCL_pkg; " +
"public class ItIsI { " +
" static { " +
" System.out.println(\"I also pass!\"); " +
" } " +
"}";
ClassFileInstaller.writeClassToDisk("XpatchTraceCL_pkg/ItIsI",
InMemoryJavaCompiler.compile("XpatchTraceCL_pkg.ItIsI", source),
ClassFileInstaller.writeClassToDisk("PatchModuleTraceCL_pkg/ItIsI",
InMemoryJavaCompiler.compile("PatchModuleTraceCL_pkg.ItIsI", source),
"xbcp");
pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:xbcp",
"-Xlog:class+load=info", "XpatchMain", "XpatchTraceCL_pkg.ItIsI");
"-Xlog:class+load=info", "PatchModuleMain", "PatchModuleTraceCL_pkg.ItIsI");
output = new OutputAnalyzer(pb.start());
// -Xbootclasspath/a case.
output.shouldContain("[class,load] XpatchTraceCL_pkg.ItIsI source: xbcp");
output.shouldContain("[class,load] PatchModuleTraceCL_pkg.ItIsI source: xbcp");
output.shouldHaveExitValue(0);
}
}

View File

@ -23,13 +23,13 @@
/*
* @test
* @summary Ensure that a newly introduced java.base package placed within the -Xpatch directory
* is considered part of the boot loader's visibility boundary
* @summary Ensure that a newly introduced java.base package placed within the --patch-module
* directory is considered part of the boot loader's visibility boundary
* @requires !(os.family == "windows")
* @library /testlibrary
* @modules java.base/jdk.internal.misc
* java.management
* @run main/othervm XpatchVisibility
* @run main/othervm PatchModuleVisibility
*/
import java.io.File;
@ -38,7 +38,7 @@ import java.nio.file.Paths;
import jdk.test.lib.*;
public class XpatchVisibility {
public class PatchModuleVisibility {
public static void main(String[] args) throws Throwable {
@ -55,19 +55,19 @@ public class XpatchVisibility {
"public class Vis2_A {" +
" public static void main(String args[]) throws Exception {" +
// Try loading a class within a newly introduced java.base
// package. Make sure the class can be found via -Xpatch.
// package. Make sure the class can be found via --patch-module.
" try {" +
" p2.Vis2_B b = new p2.Vis2_B();" +
" if (b.getClass().getClassLoader() != null) {" +
" throw new RuntimeException(\"XpatchVisibility FAILED - class B " +
" throw new RuntimeException(\"PatchModuleVisibility FAILED - class B " +
"should be loaded by boot class loader\\n\");" +
" }" +
" b.m();" +
" } catch (Throwable e) {" +
" throw new RuntimeException(\"XpatchVisibility FAILED - test " +
" throw new RuntimeException(\"PatchModuleVisibility FAILED - test " +
"should not throw an error or exception\\n\");" +
" }" +
" System.out.println(\"XpatchVisibility PASSED\\n\");" +
" System.out.println(\"PatchModuleVisibility PASSED\\n\");" +
" }" +
"}";
@ -83,8 +83,8 @@ public class XpatchVisibility {
"p2" + File.separator + "Vis2_B.class"));
new OutputAnalyzer(ProcessTools.createJavaProcessBuilder(
"-Xpatch:java.base=mods2/java.base",
"-XaddExports:java.base/p2=ALL-UNNAMED",
"--patch-module=java.base=mods2/java.base",
"--add-exports=java.base/p2=ALL-UNNAMED",
"Vis2_A")
.start()).shouldHaveExitValue(0);
}

View File

@ -50,7 +50,7 @@ public class XbootcpNoVisibility {
// Try loading a class within a named package in a module which has been defined
// to the boot loader. In this situation, the class should only be attempted
// to be loaded from the boot loader's module path which consists of:
// [-Xpatch]; exploded build | "modules" jimage
// [--patch-module]; exploded build | "modules" jimage
//
// Since the class is located on the boot loader's append path via
// -Xbootclasspath/a specification, it should not be found.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2016, 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
@ -27,7 +27,7 @@ import java.lang.module.ModuleDescriptor;
/**
* A helper class intended to be injected into java.lang.reflect using the
* java -Xpatch option. The helper class provides access to package private
* java --patch-module option. The helper class provides access to package private
* methods in java.lang.reflect.Module.
*/

View File

@ -113,9 +113,10 @@ public class TestInstanceKlassSize {
};
String[] toolArgs = {
"-XX:+UnlockDiagnosticVMOptions",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"--add-modules=jdk.hotspot.agent",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"TestInstanceKlassSize",
Long.toString(app.getPid())
};

View File

@ -107,9 +107,10 @@ public class TestInstanceKlassSizeForInterface {
// Grab the pid from the current java process and pass it
String[] toolArgs = {
"-XX:+UnlockDiagnosticVMOptions",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
"-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"--add-modules=jdk.hotspot.agent",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
"--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"TestInstanceKlassSizeForInterface",
Long.toString(ProcessTools.getProcessId())
};

View File

@ -87,7 +87,7 @@ public class JMapHProfLargeHeapTest {
String expectedFormat) throws Exception, IOException,
InterruptedException, FileNotFoundException {
ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(
"-XaddExports:java.management/sun.management=ALL-UNNAMED", vmArgs, "JMapHProfLargeHeapProc", String.valueOf(heapSize));
"--add-exports=java.management/sun.management=ALL-UNNAMED", vmArgs, "JMapHProfLargeHeapProc", String.valueOf(heapSize));
procBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
Process largeHeapProc = procBuilder.start();

View File

@ -58,10 +58,10 @@ cleantmp:
ctw.jar: filelist wb.jar
@mkdir -p $(OUTPUT_DIR)
$(JAVAC) -XaddExports:java.base/jdk.internal.jimage=ALL-UNNAMED \
-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED \
-XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED \
-sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp wb.jar @filelist
$(JAVAC) --add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
--add-exports java.base/jdk.internal.reflect=ALL-UNNAMED \
-sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp wb.jar @filelist
$(JAR) --create --file=$@ --main-class $(MAIN_CLASS) -C $(OUTPUT_DIR) .
wb.jar: wb_filelist

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2015, 2016, 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
@ -95,10 +95,10 @@ manifest:
@echo 'Main-Class: jdk.test.lib.jittester.Automatic' >> $(MANIFEST)
compile_testlib: INIT
$(JAVAC) -XDignore.symbol.file -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint $(TESTLIBRARY_SRC_FILES) -d $(CLASSES_DIR)
$(JAVAC) -XDignore.symbol.file --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint $(TESTLIBRARY_SRC_FILES) -d $(CLASSES_DIR)
COMPILE: INIT filelist compile_testlib
$(JAVAC) -cp $(CLASSES_DIR) -XDignore.symbol.file -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint -sourcepath $(SRC_DIR) -d $(CLASSES_DIR) @filelist
$(JAVAC) -cp $(CLASSES_DIR) -XDignore.symbol.file --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint -sourcepath $(SRC_DIR) -d $(CLASSES_DIR) @filelist
filelist: $(SRC_FILES)
@rm -f $@
@ -109,7 +109,7 @@ INIT: $(DIST_DIR)
$(shell if [ ! -d $(CLASSES_DIR) ]; then mkdir -p $(CLASSES_DIR); fi)
install: clean_testbase testgroup testroot copytestlibrary JAR cleantmp
$(JAVA) -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -ea -jar $(DIST_JAR) $(APPLICATION_ARGS)
$(JAVA) --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -ea -jar $(DIST_JAR) $(APPLICATION_ARGS)
clean_testbase:
@rm -rf $(TESTBASE_DIR)