< prev index next >

src/hotspot/share/memory/filemap.cpp

Print this page

*** 711,720 **** --- 711,730 ---- GrowableArray<const char*>* rp_array = create_path_array(appcp); if (rp_array->length() == 0) { // None of the jar file specified in the runtime -cp exists. return fail("None of the jar file specified in the runtime -cp exists: -Djava.class.path=", appcp); } + + // Handling of non-existent entries in the classpath: we eliminate all the non-existent + // entries from both the dump time classpath (ClassLoader::update_class_path_entry_list) + // and the runtime classpath (FileMapInfo::create_path_array), and check the remaining + // entries. E.g.: + // + // dump : -cp a.jar:NE1:NE2:b.jar -> a.jar:b.jar -> recorded in archive. + // run 1: -cp NE3:a.jar:NE4:b.jar -> a.jar:b.jar -> matched + // run 2: -cp x.jar:NE4:b.jar -> x.jar:b.jar -> mismatched + int j = _header->_app_class_paths_start_index; mismatch = check_paths(j, shared_app_paths_len, rp_array); if (mismatch) { return fail("[APP classpath mismatch, actual: -Djava.class.path=", appcp); }
*** 805,817 **** fail_continue("shared class paths mismatch (hint: enable -Xlog:class+path=info to diagnose the failure)"); return false; } } ! if (!validate_non_existent_class_paths()) { ! return false; ! } _validating_shared_path_table = false; #if INCLUDE_JVMTI if (_classpath_entries_for_jvmti != NULL) { --- 815,825 ---- fail_continue("shared class paths mismatch (hint: enable -Xlog:class+path=info to diagnose the failure)"); return false; } } ! validate_non_existent_class_paths(); _validating_shared_path_table = false; #if INCLUDE_JVMTI if (_classpath_entries_for_jvmti != NULL) {
*** 823,848 **** #endif return true; } ! bool FileMapInfo::validate_non_existent_class_paths() const { assert(UseSharedSpaces, "runtime only"); for (int i = _header->_app_module_paths_start_index + _header->_num_module_paths; i < get_number_of_shared_paths(); i++) { SharedClassPathEntry* ent = shared_path(i); if (!ent->check_non_existent()) { ! fail_continue("file must not exist: %s", ent->name()); ! return false; } } - return true; } - - bool FileMapInfo::check_archive(const char* archive_name, bool is_static) { int fd = os::open(archive_name, O_RDONLY | O_BINARY, 0); if (fd < 0) { // do not vm_exit_during_initialization here because Arguments::init_shared_archive_paths() // requires a shared archive name. The open_for_read() function will log a message regarding --- 831,860 ---- #endif return true; } ! void FileMapInfo::validate_non_existent_class_paths() { ! // All of the recorded non-existent paths came from the Class-Path: attribute from the JAR ! // files on the app classpath. If any of these are found to exist during runtime, ! // it will change how classes are loading for the app loader. For safety, disable ! // loading of archived platform/app classes (currently there's no way to disable just the ! // app classes). ! assert(UseSharedSpaces, "runtime only"); for (int i = _header->_app_module_paths_start_index + _header->_num_module_paths; i < get_number_of_shared_paths(); i++) { SharedClassPathEntry* ent = shared_path(i); if (!ent->check_non_existent()) { ! warning("Archived non-system classes are disabled because the " ! "file %s exists", ent->name()); ! _header->_has_platform_or_app_classes = false; } } } bool FileMapInfo::check_archive(const char* archive_name, bool is_static) { int fd = os::open(archive_name, O_RDONLY | O_BINARY, 0); if (fd < 0) { // do not vm_exit_during_initialization here because Arguments::init_shared_archive_paths() // requires a shared archive name. The open_for_read() function will log a message regarding
< prev index next >