Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8256299: Implement JEP 396: Strongly Encapsulate JDK Internals by Default #1324

Closed
wants to merge 6 commits into from
1 change: 1 addition & 0 deletions src/hotspot/share/runtime/arguments.cpp
Expand Up @@ -2576,6 +2576,7 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m
return res;
}
} else if (match_option(option, "--illegal-access=", &tail)) {
warning("Option --illegal-access is deprecated and will be removed in a future release.");
if (!create_module_property("jdk.module.illegalAccess", tail, ExternalProperty)) {
return JNI_ENOMEM;
}
Expand Down
Expand Up @@ -27,35 +27,27 @@
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 {
Expand Down
Expand Up @@ -24,16 +24,14 @@
*/
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;
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;
Expand All @@ -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() {
Expand All @@ -74,14 +66,6 @@ Function<String, ClassLoader> classLoaderFunction() {
return classLoaderFunction;
}

Map<String, Set<String>> concealedPackagesToOpen() {
return concealedPackagesToOpen;
}

Map<String, Set<String>> exportedPackagesToOpen() {
return exportedPackagesToOpen;
}

boolean hasSplitPackages() {
return hasSplitPackages;
}
Expand Down Expand Up @@ -110,16 +94,12 @@ static void archive(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) {
archivedModuleGraph = new ArchivedModuleGraph(hasSplitPackages,
hasIncubatorModules,
finder,
configuration,
classLoaderFunction,
concealedPackagesToOpen,
exportedPackagesToOpen);
classLoaderFunction);
}

static {
Expand Down
101 changes: 40 additions & 61 deletions src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java
Expand Up @@ -141,14 +141,14 @@ public static ModuleFinder limitedFinder() {
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
}

/**
Expand All @@ -172,12 +172,6 @@ public static ModuleLayer boot() {
// 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();
}
Expand All @@ -192,10 +186,10 @@ private static ModuleLayer boot2() {
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");
Expand Down Expand Up @@ -227,7 +221,8 @@ private static ModuleLayer boot2() {
&& !haveModulePath
&& addModules.isEmpty()
&& limitModules.isEmpty()
&& !isPatched) {
&& !isPatched
&& illegalAccess == null) {
systemModuleFinder = archivedModuleGraph.finder();
hasSplitPackages = archivedModuleGraph.hasSplitPackages();
hasIncubatorModules = archivedModuleGraph.hasIncubatorModules();
Expand Down Expand Up @@ -464,21 +459,15 @@ private static ModuleLayer boot2() {
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
Expand All @@ -495,12 +484,9 @@ private static ModuleLayer boot2() {
hasIncubatorModules,
systemModuleFinder,
cf,
clf,
concealedPackagesToOpen,
exportedPackagesToOpen);

clf);
if (!hasSplitPackages && !hasIncubatorModules) {
ArchivedBootLayer.archive(bootLayer, builder);
ArchivedBootLayer.archive(bootLayer);
}
}

Expand Down Expand Up @@ -794,38 +780,32 @@ private static void addExtraExportsOrOpens(ModuleLayer bootLayer,
}

/**
* 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;
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;
}
}
IllegalAccessLogger.Builder builder
= new IllegalAccessLogger.Builder(mode, System.err);
};

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());
Expand Down Expand Up @@ -887,7 +867,6 @@ private static void addExtraExportsOrOpens(ModuleLayer bootLayer,
}

builder.complete();
return builder;
}

/**
Expand Down