2960 CommandLineFlags::printFlags(tty, false); |
2960 CommandLineFlags::printFlags(tty, false); |
2961 vm_exit(0); |
2961 vm_exit(0); |
2962 #endif |
2962 #endif |
2963 // -D |
2963 // -D |
2964 } else if (match_option(option, "-D", &tail)) { |
2964 } else if (match_option(option, "-D", &tail)) { |
|
2965 if (CheckEndorsedAndExtDirs) { |
|
2966 if (match_option(option, "-Djava.endorsed.dirs=", &tail)) { |
|
2967 // abort if -Djava.endorsed.dirs is set |
|
2968 jio_fprintf(defaultStream::output_stream(), |
|
2969 "-Djava.endorsed.dirs will not be supported in a future release.\n" |
|
2970 "Refer to JEP 220 for details (http://openjdk.java.net/jeps/220).\n"); |
|
2971 return JNI_EINVAL; |
|
2972 } |
|
2973 if (match_option(option, "-Djava.ext.dirs=", &tail)) { |
|
2974 // abort if -Djava.ext.dirs is set |
|
2975 jio_fprintf(defaultStream::output_stream(), |
|
2976 "-Djava.ext.dirs will not be supported in a future release.\n" |
|
2977 "Refer to JEP 220 for details (http://openjdk.java.net/jeps/220).\n"); |
|
2978 return JNI_EINVAL; |
|
2979 } |
|
2980 } |
|
2981 |
2965 if (!add_property(tail)) { |
2982 if (!add_property(tail)) { |
2966 return JNI_ENOMEM; |
2983 return JNI_ENOMEM; |
2967 } |
2984 } |
2968 // Out of the box management support |
2985 // Out of the box management support |
2969 if (match_option(option, "-Dcom.sun.management", &tail)) { |
2986 if (match_option(option, "-Dcom.sun.management", &tail)) { |
3393 if (!PrintSharedArchiveAndExit) { |
3410 if (!PrintSharedArchiveAndExit) { |
3394 ClassLoader::trace_class_path("[classpath: ", _java_class_path->value()); |
3411 ClassLoader::trace_class_path("[classpath: ", _java_class_path->value()); |
3395 } |
3412 } |
3396 } |
3413 } |
3397 |
3414 |
|
3415 static bool has_jar_files(const char* directory) { |
|
3416 DIR* dir = os::opendir(directory); |
|
3417 if (dir == NULL) return false; |
|
3418 |
|
3419 struct dirent *entry; |
|
3420 char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory), mtInternal); |
|
3421 bool hasJarFile = false; |
|
3422 while (!hasJarFile && (entry = os::readdir(dir, (dirent *) dbuf)) != NULL) { |
|
3423 const char* name = entry->d_name; |
|
3424 const char* ext = name + strlen(name) - 4; |
|
3425 hasJarFile = ext > name && (os::file_name_strcmp(ext, ".jar") == 0); |
|
3426 } |
|
3427 FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); |
|
3428 os::closedir(dir); |
|
3429 return hasJarFile ; |
|
3430 } |
|
3431 |
|
3432 // returns the number of directories in the given path containing JAR files |
|
3433 // If the skip argument is not NULL, it will skip that directory |
|
3434 static int check_non_empty_dirs(const char* path, const char* type, const char* skip) { |
|
3435 const char separator = *os::path_separator(); |
|
3436 const char* const end = path + strlen(path); |
|
3437 int nonEmptyDirs = 0; |
|
3438 while (path < end) { |
|
3439 const char* tmp_end = strchr(path, separator); |
|
3440 if (tmp_end == NULL) { |
|
3441 if ((skip == NULL || strcmp(path, skip) != 0) && has_jar_files(path)) { |
|
3442 nonEmptyDirs++; |
|
3443 jio_fprintf(defaultStream::output_stream(), |
|
3444 "Non-empty %s directory: %s\n", type, path); |
|
3445 } |
|
3446 path = end; |
|
3447 } else { |
|
3448 char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1, mtInternal); |
|
3449 memcpy(dirpath, path, tmp_end - path); |
|
3450 dirpath[tmp_end - path] = '\0'; |
|
3451 if ((skip == NULL || strcmp(dirpath, skip) != 0) && has_jar_files(dirpath)) { |
|
3452 nonEmptyDirs++; |
|
3453 jio_fprintf(defaultStream::output_stream(), |
|
3454 "Non-empty %s directory: %s\n", type, dirpath); |
|
3455 } |
|
3456 FREE_C_HEAP_ARRAY(char, dirpath, mtInternal); |
|
3457 path = tmp_end + 1; |
|
3458 } |
|
3459 } |
|
3460 return nonEmptyDirs; |
|
3461 } |
|
3462 |
|
3463 // Returns true if endorsed standards override mechanism and extension mechanism |
|
3464 // are not used. |
|
3465 static bool check_endorsed_and_ext_dirs() { |
|
3466 if (!CheckEndorsedAndExtDirs) |
|
3467 return true; |
|
3468 |
|
3469 char endorsedDir[JVM_MAXPATHLEN]; |
|
3470 char extDir[JVM_MAXPATHLEN]; |
|
3471 const char* fileSep = os::file_separator(); |
|
3472 jio_snprintf(endorsedDir, sizeof(endorsedDir), "%s%slib%sendorsed", |
|
3473 Arguments::get_java_home(), fileSep, fileSep); |
|
3474 jio_snprintf(extDir, sizeof(extDir), "%s%slib%sext", |
|
3475 Arguments::get_java_home(), fileSep, fileSep); |
|
3476 |
|
3477 // check endorsed directory |
|
3478 int nonEmptyDirs = check_non_empty_dirs(Arguments::get_endorsed_dir(), "endorsed", NULL); |
|
3479 |
|
3480 // check the extension directories but skip the default lib/ext directory |
|
3481 nonEmptyDirs += check_non_empty_dirs(Arguments::get_ext_dirs(), "extension", extDir); |
|
3482 |
|
3483 // List of JAR files installed in the default lib/ext directory. |
|
3484 // -XX:+CheckEndorsedAndExtDirs checks if any non-JDK file installed |
|
3485 static const char* jdk_ext_jars[] = { |
|
3486 "access-bridge-32.jar", |
|
3487 "access-bridge-64.jar", |
|
3488 "access-bridge.jar", |
|
3489 "cldrdata.jar", |
|
3490 "dnsns.jar", |
|
3491 "jaccess.jar", |
|
3492 "jfxrt.jar", |
|
3493 "localedata.jar", |
|
3494 "nashorn.jar", |
|
3495 "sunec.jar", |
|
3496 "sunjce_provider.jar", |
|
3497 "sunmscapi.jar", |
|
3498 "sunpkcs11.jar", |
|
3499 "ucrypto.jar", |
|
3500 "zipfs.jar", |
|
3501 NULL |
|
3502 }; |
|
3503 |
|
3504 // check if the default lib/ext directory has any non-JDK jar files; if so, error |
|
3505 DIR* dir = os::opendir(extDir); |
|
3506 if (dir != NULL) { |
|
3507 int num_ext_jars = 0; |
|
3508 struct dirent *entry; |
|
3509 char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(extDir), mtInternal); |
|
3510 while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) { |
|
3511 const char* name = entry->d_name; |
|
3512 const char* ext = name + strlen(name) - 4; |
|
3513 if (ext > name && (os::file_name_strcmp(ext, ".jar") == 0)) { |
|
3514 bool is_jdk_jar = false; |
|
3515 const char* jarfile = NULL; |
|
3516 for (int i=0; (jarfile = jdk_ext_jars[i]) != NULL; i++) { |
|
3517 if (os::file_name_strcmp(name, jarfile) == 0) { |
|
3518 is_jdk_jar = true; |
|
3519 break; |
|
3520 } |
|
3521 } |
|
3522 if (!is_jdk_jar) { |
|
3523 jio_fprintf(defaultStream::output_stream(), |
|
3524 "%s installed in <JAVA_HOME>/lib/ext\n", name); |
|
3525 num_ext_jars++; |
|
3526 } |
|
3527 } |
|
3528 } |
|
3529 FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); |
|
3530 os::closedir(dir); |
|
3531 if (num_ext_jars > 0) { |
|
3532 nonEmptyDirs += 1; |
|
3533 } |
|
3534 } |
|
3535 |
|
3536 // check if the default lib/endorsed directory exists; if so, error |
|
3537 dir = os::opendir(endorsedDir); |
|
3538 if (dir != NULL) { |
|
3539 jio_fprintf(defaultStream::output_stream(), "<JAVA_HOME>/lib/endorsed exists\n"); |
|
3540 os::closedir(dir); |
|
3541 nonEmptyDirs += 1; |
|
3542 } |
|
3543 |
|
3544 if (nonEmptyDirs > 0) { |
|
3545 jio_fprintf(defaultStream::output_stream(), |
|
3546 "Endorsed standards override mechanism and extension mechanism" |
|
3547 "will not be supported in a future release.\n" |
|
3548 "Refer to JEP 220 for details (http://openjdk.java.net/jeps/220).\n"); |
|
3549 return false; |
|
3550 } |
|
3551 |
|
3552 return true; |
|
3553 } |
|
3554 |
3398 jint Arguments::finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required) { |
3555 jint Arguments::finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required) { |
3399 // This must be done after all -D arguments have been processed. |
3556 // This must be done after all -D arguments have been processed. |
3400 scp_p->expand_endorsed(); |
3557 scp_p->expand_endorsed(); |
3401 |
3558 |
3402 if (scp_assembly_required || scp_p->get_endorsed() != NULL) { |
3559 if (scp_assembly_required || scp_p->get_endorsed() != NULL) { |
3403 // Assemble the bootclasspath elements into the final path. |
3560 // Assemble the bootclasspath elements into the final path. |
3404 Arguments::set_sysclasspath(scp_p->combined_path()); |
3561 Arguments::set_sysclasspath(scp_p->combined_path()); |
|
3562 } |
|
3563 |
|
3564 if (!check_endorsed_and_ext_dirs()) { |
|
3565 return JNI_ERR; |
3405 } |
3566 } |
3406 |
3567 |
3407 // This must be done after all arguments have been processed. |
3568 // This must be done after all arguments have been processed. |
3408 // java_compiler() true means set to "NONE" or empty. |
3569 // java_compiler() true means set to "NONE" or empty. |
3409 if (java_compiler() && !xdebug_mode()) { |
3570 if (java_compiler() && !xdebug_mode()) { |