mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-19 10:34:38 +02:00
8256299: Implement JEP 396: Strongly Encapsulate JDK Internals by Default
Co-authored-by: Alan Bateman <alanb@openjdk.org> Reviewed-by: mchung, alanb
This commit is contained in:
parent
c47ab5f6b7
commit
ed4c4ee73b
5 changed files with 90 additions and 139 deletions
|
@ -27,35 +27,27 @@ package jdk.internal.module;
|
|||
import jdk.internal.misc.CDS;
|
||||
|
||||
/**
|
||||
* Used by ModuleBootstrap for archiving the boot layer and the builder needed to
|
||||
* set the IllegalAccessLogger.
|
||||
* Used by ModuleBootstrap for archiving the boot layer.
|
||||
*/
|
||||
class ArchivedBootLayer {
|
||||
private static ArchivedBootLayer archivedBootLayer;
|
||||
|
||||
private final ModuleLayer bootLayer;
|
||||
private final IllegalAccessLogger.Builder builder;
|
||||
|
||||
private ArchivedBootLayer(ModuleLayer bootLayer,
|
||||
IllegalAccessLogger.Builder builder) {
|
||||
private ArchivedBootLayer(ModuleLayer bootLayer) {
|
||||
this.bootLayer = bootLayer;
|
||||
this.builder = builder;
|
||||
}
|
||||
|
||||
ModuleLayer bootLayer() {
|
||||
return bootLayer;
|
||||
}
|
||||
|
||||
IllegalAccessLogger.Builder illegalAccessLoggerBuilder() {
|
||||
return builder;
|
||||
}
|
||||
|
||||
static ArchivedBootLayer get() {
|
||||
return archivedBootLayer;
|
||||
}
|
||||
|
||||
static void archive(ModuleLayer layer, IllegalAccessLogger.Builder builder) {
|
||||
archivedBootLayer = new ArchivedBootLayer(layer, builder);
|
||||
static void archive(ModuleLayer layer) {
|
||||
archivedBootLayer = new ArchivedBootLayer(layer);
|
||||
}
|
||||
|
||||
static {
|
||||
|
|
|
@ -24,8 +24,6 @@
|
|||
*/
|
||||
package jdk.internal.module;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
|
@ -33,7 +31,7 @@ import jdk.internal.misc.CDS;
|
|||
|
||||
/**
|
||||
* Used by ModuleBootstrap for archiving the configuration for the boot layer,
|
||||
* the system module finder, and the maps used to create the IllegalAccessLogger.
|
||||
* and the system module finder.
|
||||
*/
|
||||
class ArchivedModuleGraph {
|
||||
private static ArchivedModuleGraph archivedModuleGraph;
|
||||
|
@ -43,23 +41,17 @@ class ArchivedModuleGraph {
|
|||
private final ModuleFinder finder;
|
||||
private final Configuration configuration;
|
||||
private final Function<String, ClassLoader> classLoaderFunction;
|
||||
private final Map<String, Set<String>> concealedPackagesToOpen;
|
||||
private final Map<String, Set<String>> exportedPackagesToOpen;
|
||||
|
||||
private ArchivedModuleGraph(boolean hasSplitPackages,
|
||||
boolean hasIncubatorModules,
|
||||
ModuleFinder finder,
|
||||
Configuration configuration,
|
||||
Function<String, ClassLoader> classLoaderFunction,
|
||||
Map<String, Set<String>> concealedPackagesToOpen,
|
||||
Map<String, Set<String>> exportedPackagesToOpen) {
|
||||
Function<String, ClassLoader> classLoaderFunction) {
|
||||
this.hasSplitPackages = hasSplitPackages;
|
||||
this.hasIncubatorModules = hasIncubatorModules;
|
||||
this.finder = finder;
|
||||
this.configuration = configuration;
|
||||
this.classLoaderFunction = classLoaderFunction;
|
||||
this.concealedPackagesToOpen = concealedPackagesToOpen;
|
||||
this.exportedPackagesToOpen = exportedPackagesToOpen;
|
||||
}
|
||||
|
||||
ModuleFinder finder() {
|
||||
|
@ -74,14 +66,6 @@ class ArchivedModuleGraph {
|
|||
return classLoaderFunction;
|
||||
}
|
||||
|
||||
Map<String, Set<String>> concealedPackagesToOpen() {
|
||||
return concealedPackagesToOpen;
|
||||
}
|
||||
|
||||
Map<String, Set<String>> exportedPackagesToOpen() {
|
||||
return exportedPackagesToOpen;
|
||||
}
|
||||
|
||||
boolean hasSplitPackages() {
|
||||
return hasSplitPackages;
|
||||
}
|
||||
|
@ -110,16 +94,12 @@ class ArchivedModuleGraph {
|
|||
boolean hasIncubatorModules,
|
||||
ModuleFinder finder,
|
||||
Configuration configuration,
|
||||
Function<String, ClassLoader> classLoaderFunction,
|
||||
Map<String, Set<String>> concealedPackagesToOpen,
|
||||
Map<String, Set<String>> exportedPackagesToOpen) {
|
||||
Function<String, ClassLoader> classLoaderFunction) {
|
||||
archivedModuleGraph = new ArchivedModuleGraph(hasSplitPackages,
|
||||
hasIncubatorModules,
|
||||
finder,
|
||||
configuration,
|
||||
classLoaderFunction,
|
||||
concealedPackagesToOpen,
|
||||
exportedPackagesToOpen);
|
||||
classLoaderFunction);
|
||||
}
|
||||
|
||||
static {
|
||||
|
|
|
@ -141,14 +141,14 @@ public final class ModuleBootstrap {
|
|||
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.patch.0") == null && // --patch-module
|
||||
getProperty("jdk.module.main") == null && // --module
|
||||
getProperty("jdk.module.addmods.0") == null && // --add-modules
|
||||
getProperty("jdk.module.limitmods") == null && // --limit-modules
|
||||
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;
|
||||
getProperty("jdk.module.illegalAccess") == null; // --illegal-access
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -172,12 +172,6 @@ public final class ModuleBootstrap {
|
|||
// 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();
|
||||
}
|
||||
|
@ -192,10 +186,10 @@ public final class ModuleBootstrap {
|
|||
ModuleFinder upgradeModulePath = finderFor("jdk.module.upgrade.path");
|
||||
ModuleFinder appModulePath = finderFor("jdk.module.path");
|
||||
boolean isPatched = patcher.hasPatches();
|
||||
|
||||
String mainModule = System.getProperty("jdk.module.main");
|
||||
Set<String> addModules = addModules();
|
||||
Set<String> limitModules = limitModules();
|
||||
String illegalAccess = getAndRemoveProperty("jdk.module.illegalAccess");
|
||||
|
||||
PrintStream traceOutput = null;
|
||||
String trace = getAndRemoveProperty("jdk.module.showModuleResolution");
|
||||
|
@ -227,7 +221,8 @@ public final class ModuleBootstrap {
|
|||
&& !haveModulePath
|
||||
&& addModules.isEmpty()
|
||||
&& limitModules.isEmpty()
|
||||
&& !isPatched) {
|
||||
&& !isPatched
|
||||
&& illegalAccess == null) {
|
||||
systemModuleFinder = archivedModuleGraph.finder();
|
||||
hasSplitPackages = archivedModuleGraph.hasSplitPackages();
|
||||
hasIncubatorModules = archivedModuleGraph.hasIncubatorModules();
|
||||
|
@ -464,21 +459,15 @@ public final class ModuleBootstrap {
|
|||
addExtraReads(bootLayer);
|
||||
boolean extraExportsOrOpens = addExtraExportsAndOpens(bootLayer);
|
||||
|
||||
Map<String, Set<String>> concealedPackagesToOpen;
|
||||
Map<String, Set<String>> exportedPackagesToOpen;
|
||||
if (archivedModuleGraph != null) {
|
||||
concealedPackagesToOpen = archivedModuleGraph.concealedPackagesToOpen();
|
||||
exportedPackagesToOpen = archivedModuleGraph.exportedPackagesToOpen();
|
||||
} else {
|
||||
concealedPackagesToOpen = systemModules.concealedPackagesToOpen();
|
||||
exportedPackagesToOpen = systemModules.exportedPackagesToOpen();
|
||||
}
|
||||
IllegalAccessLogger.Builder builder =
|
||||
addIllegalAccess(upgradeModulePath,
|
||||
concealedPackagesToOpen,
|
||||
exportedPackagesToOpen,
|
||||
if (illegalAccess != null) {
|
||||
assert systemModules != null;
|
||||
addIllegalAccess(illegalAccess,
|
||||
systemModules,
|
||||
upgradeModulePath,
|
||||
bootLayer,
|
||||
extraExportsOrOpens);
|
||||
}
|
||||
|
||||
Counters.add("jdk.module.boot.7.adjustModulesTime");
|
||||
|
||||
// save module finders for later use
|
||||
|
@ -495,12 +484,9 @@ public final class ModuleBootstrap {
|
|||
hasIncubatorModules,
|
||||
systemModuleFinder,
|
||||
cf,
|
||||
clf,
|
||||
concealedPackagesToOpen,
|
||||
exportedPackagesToOpen);
|
||||
|
||||
clf);
|
||||
if (!hasSplitPackages && !hasIncubatorModules) {
|
||||
ArchivedBootLayer.archive(bootLayer, builder);
|
||||
ArchivedBootLayer.archive(bootLayer);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -794,38 +780,32 @@ public final class ModuleBootstrap {
|
|||
}
|
||||
|
||||
/**
|
||||
* Process the --illegal-access option (and its default) to open packages
|
||||
* of system modules in the boot layer to code in unnamed modules.
|
||||
* Process the --illegal-access option 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;
|
||||
case "debug":
|
||||
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);
|
||||
private static void addIllegalAccess(String illegalAccess,
|
||||
SystemModules systemModules,
|
||||
ModuleFinder upgradeModulePath,
|
||||
ModuleLayer bootLayer,
|
||||
boolean extraExportsOrOpens) {
|
||||
|
||||
if (illegalAccess.equals("deny"))
|
||||
return; // nothing to do
|
||||
|
||||
IllegalAccessLogger.Mode mode = switch (illegalAccess) {
|
||||
case "permit" -> IllegalAccessLogger.Mode.ONESHOT;
|
||||
case "warn" -> IllegalAccessLogger.Mode.WARN;
|
||||
case "debug" -> IllegalAccessLogger.Mode.DEBUG;
|
||||
default -> {
|
||||
fail("Value specified to --illegal-access not recognized:"
|
||||
+ " '" + illegalAccess + "'");
|
||||
yield null;
|
||||
}
|
||||
};
|
||||
|
||||
var builder = new IllegalAccessLogger.Builder(mode, System.err);
|
||||
Map<String, Set<String>> concealedPackagesToOpen = systemModules.concealedPackagesToOpen();
|
||||
Map<String, Set<String>> exportedPackagesToOpen = systemModules.exportedPackagesToOpen();
|
||||
if (concealedPackagesToOpen.isEmpty() && exportedPackagesToOpen.isEmpty()) {
|
||||
// need to generate (exploded build)
|
||||
IllegalAccessMaps maps = IllegalAccessMaps.generate(limitedFinder());
|
||||
|
@ -887,7 +867,6 @@ public final class ModuleBootstrap {
|
|||
}
|
||||
|
||||
builder.complete();
|
||||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue