< prev index next >

src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java

Print this page

*** 40,61 **** import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; - import jdk.internal.loader.BootLoader; - import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.access.JavaLangAccess; import jdk.internal.access.JavaLangModuleAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.perf.PerfCounter; /** * Initializes/boots the module system. * --- 40,62 ---- import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import jdk.internal.access.JavaLangAccess; import jdk.internal.access.JavaLangModuleAccess; import jdk.internal.access.SharedSecrets; + import jdk.internal.loader.BootLoader; + import jdk.internal.loader.BuiltinClassLoader; + import jdk.internal.loader.ClassLoaders; + import jdk.internal.misc.VM; import jdk.internal.perf.PerfCounter; /** * Initializes/boots the module system. *
*** 84,95 **** // the token for "all modules on the module path" private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH"; // access to java.lang/module ! private static final JavaLangModuleAccess JLMA ! = SharedSecrets.getJavaLangModuleAccess(); // The ModulePatcher for the initial configuration private static final ModulePatcher patcher = initModulePatcher(); /** --- 85,96 ---- // the token for "all modules on the module path" private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH"; // access to java.lang/module ! private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess(); ! private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); // The ModulePatcher for the initial configuration private static final ModulePatcher patcher = initModulePatcher(); /**
*** 132,149 **** return finder; } } /** ! * Initialize the module system, returning the boot layer. * * @see java.lang.System#initPhase2(boolean, boolean) */ ! public static ModuleLayer boot() throws Exception { ! Counters.start(); // Step 0: Command line options ModuleFinder upgradeModulePath = finderFor("jdk.module.upgrade.path"); ModuleFinder appModulePath = finderFor("jdk.module.path"); boolean isPatched = patcher.hasPatches(); --- 133,194 ---- return finder; } } /** ! * Returns true if the archived boot layer can be used. The system properties ! * are checked in the order that they are used by boot2. ! */ ! private static boolean canUseArchivedBootLayer() { ! return getProperty("jdk.module.upgrade.path") == null && ! getProperty("jdk.module.path") == null && ! getProperty("jdk.module.patch.0") == null && // --patch-module ! getProperty("jdk.module.main") == null && ! getProperty("jdk.module.addmods.0") == null && // --add-modules ! getProperty("jdk.module.limitmods") == null && ! getProperty("jdk.module.addreads.0") == null && // --add-reads ! getProperty("jdk.module.addexports.0") == null && // --add-exports ! getProperty("jdk.module.addopens.0") == null && // --add-opens ! getProperty("jdk.module.illegalAccess") == null; ! } ! ! /** ! * Initialize the module system, returning the boot layer. The boot layer ! * is obtained from the CDS archive if possible, otherwise it is generated ! * from the module graph. * * @see java.lang.System#initPhase2(boolean, boolean) */ ! public static ModuleLayer boot() { Counters.start(); + ModuleLayer bootLayer; + ArchivedBootLayer archivedBootLayer = ArchivedBootLayer.get(); + if (archivedBootLayer != null) { + assert canUseArchivedBootLayer(); + bootLayer = archivedBootLayer.bootLayer(); + BootLoader.getUnnamedModule(); // trigger <clinit> of BootLoader. + VM.defineArchivedModules(ClassLoaders.platformClassLoader(), ClassLoaders.appClassLoader()); + + // assume boot layer has at least one module providing a service + // that is mapped to the application class loader. + JLA.bindToLoader(bootLayer, ClassLoaders.appClassLoader()); + + // IllegalAccessLogger needs to be set + var illegalAccessLoggerBuilder = archivedBootLayer.illegalAccessLoggerBuilder(); + if (illegalAccessLoggerBuilder != null) { + illegalAccessLoggerBuilder.complete(); + } + } else { + bootLayer = boot2(); + } + + Counters.publish("jdk.module.boot.totalTime"); + return bootLayer; + } + + private static ModuleLayer boot2() { // Step 0: Command line options ModuleFinder upgradeModulePath = finderFor("jdk.module.upgrade.path"); ModuleFinder appModulePath = finderFor("jdk.module.path"); boolean isPatched = patcher.hasPatches();
*** 426,435 **** --- 471,481 ---- exportedPackagesToOpen = archivedModuleGraph.exportedPackagesToOpen(); } else { concealedPackagesToOpen = systemModules.concealedPackagesToOpen(); exportedPackagesToOpen = systemModules.exportedPackagesToOpen(); } + IllegalAccessLogger.Builder builder = addIllegalAccess(upgradeModulePath, concealedPackagesToOpen, exportedPackagesToOpen, bootLayer, extraExportsOrOpens);
*** 440,464 **** unlimitedFinder = new SafeModuleFinder(savedModuleFinder); if (savedModuleFinder != finder) limitedFinder = new SafeModuleFinder(finder); } ! // Module graph can be archived at CDS dump time. Only allow the ! // unnamed module case for now. if (canArchive && (mainModule == null)) { ! ArchivedModuleGraph.archive( ! new ArchivedModuleGraph(hasSplitPackages, hasIncubatorModules, systemModuleFinder, cf, clf, concealedPackagesToOpen, ! exportedPackagesToOpen)); ! } ! // total time to initialize ! Counters.publish("jdk.module.boot.totalTime"); return bootLayer; } /** --- 486,510 ---- unlimitedFinder = new SafeModuleFinder(savedModuleFinder); if (savedModuleFinder != finder) limitedFinder = new SafeModuleFinder(finder); } ! // Archive module graph and boot layer can be archived at CDS dump time. ! // Only allow the unnamed module case for now. if (canArchive && (mainModule == null)) { ! ArchivedModuleGraph.archive(hasSplitPackages, hasIncubatorModules, systemModuleFinder, cf, clf, concealedPackagesToOpen, ! exportedPackagesToOpen); ! if (!hasSplitPackages && !hasIncubatorModules) { ! ArchivedBootLayer.archive(bootLayer, builder); ! } ! } return bootLayer; } /**
*** 749,769 **** /** * Process the --illegal-access option (and its default) to open packages * of system modules in the boot layer to code in unnamed modules. */ ! private static void addIllegalAccess(ModuleFinder upgradeModulePath, Map<String, Set<String>> concealedPackagesToOpen, Map<String, Set<String>> exportedPackagesToOpen, ModuleLayer bootLayer, boolean extraExportsOrOpens) { String value = getAndRemoveProperty("jdk.module.illegalAccess"); IllegalAccessLogger.Mode mode = IllegalAccessLogger.Mode.ONESHOT; if (value != null) { switch (value) { case "deny": ! return; case "permit": break; case "warn": mode = IllegalAccessLogger.Mode.WARN; break; --- 795,816 ---- /** * Process the --illegal-access option (and its default) to open packages * of system modules in the boot layer to code in unnamed modules. */ ! private static IllegalAccessLogger.Builder ! addIllegalAccess(ModuleFinder upgradeModulePath, Map<String, Set<String>> concealedPackagesToOpen, Map<String, Set<String>> exportedPackagesToOpen, ModuleLayer bootLayer, boolean extraExportsOrOpens) { String value = getAndRemoveProperty("jdk.module.illegalAccess"); IllegalAccessLogger.Mode mode = IllegalAccessLogger.Mode.ONESHOT; if (value != null) { switch (value) { case "deny": ! return null; case "permit": break; case "warn": mode = IllegalAccessLogger.Mode.WARN; break;
*** 771,781 **** mode = IllegalAccessLogger.Mode.DEBUG; break; default: fail("Value specified to --illegal-access not recognized:" + " '" + value + "'"); ! return; } } IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(mode, System.err); --- 818,828 ---- mode = IllegalAccessLogger.Mode.DEBUG; break; default: fail("Value specified to --illegal-access not recognized:" + " '" + value + "'"); ! return null; } } IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(mode, System.err);
*** 834,848 **** // log reflective access to non-public members/types in exported packages builder.logAccessToExportedPackages(m, exportedPackages); // open the packages to unnamed modules ! JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); ! jla.addOpensToAllUnnamed(m, concealedPackages, exportedPackages); } builder.complete(); } /** * Decodes the values of --add-reads, -add-exports, --add-opens or * --patch-modules options that are encoded in system properties. --- 881,895 ---- // log reflective access to non-public members/types in exported packages builder.logAccessToExportedPackages(m, exportedPackages); // open the packages to unnamed modules ! JLA.addOpensToAllUnnamed(m, concealedPackages, exportedPackages); } builder.complete(); + return builder; } /** * Decodes the values of --add-reads, -add-exports, --add-opens or * --patch-modules options that are encoded in system properties.
*** 903,917 **** */ private static Map<String, List<String>> decode(String prefix) { return decode(prefix, ",", true); } /** * Gets and remove the named system property */ private static String getAndRemoveProperty(String key) { ! return (String)System.getProperties().remove(key); } /** * Checks incubating status of modules in the configuration */ --- 950,972 ---- */ private static Map<String, List<String>> decode(String prefix) { return decode(prefix, ",", true); } + + /** + * Gets the named system property + */ + private static String getProperty(String key) { + return System.getProperty(key); + } + /** * Gets and remove the named system property */ private static String getAndRemoveProperty(String key) { ! return (String) System.getProperties().remove(key); } /** * Checks incubating status of modules in the configuration */
< prev index next >