< prev index next >
src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java
Print this page
*** 24,42 ****
--- 24,45 ----
*/
package jdk.internal.module;
import java.io.File;
+ import java.io.IOException;
import java.io.PrintStream;
+ import java.io.UncheckedIOException;
import java.lang.module.Configuration;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
import java.lang.module.ResolvedModule;
import java.lang.reflect.Layer;
import java.lang.reflect.Module;
import java.net.URI;
+ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
*** 44,53 ****
--- 47,57 ----
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
+ import java.util.stream.Stream;
import jdk.internal.loader.BootLoader;
import jdk.internal.loader.BuiltinClassLoader;
import jdk.internal.misc.SharedSecrets;
import jdk.internal.perf.PerfCounter;
*** 112,122 ****
public static Layer boot() {
long t0 = System.nanoTime();
// system modules (may be patched)
! ModuleFinder systemModules = ModuleFinder.ofSystem();
PerfCounters.systemModulesTime.addElapsedTimeFrom(t0);
long t1 = System.nanoTime();
--- 116,131 ----
public static Layer boot() {
long t0 = System.nanoTime();
// system modules (may be patched)
! ModuleFinder systemModules;
! if (SystemModules.MODULE_NAMES.length > 0) {
! systemModules = SystemModuleFinder.getInstance();
! } else {
! systemModules = ModuleFinder.ofSystem();
! }
PerfCounters.systemModulesTime.addElapsedTimeFrom(t0);
long t1 = System.nanoTime();
*** 273,283 ****
if (Boolean.getBoolean("jdk.launcher.traceResolver"))
traceOutput = System.out;
// run the resolver to create the configuration
Configuration cf = SharedSecrets.getJavaLangModuleAccess()
! .resolveRequiresAndUses(finder,
roots,
needPostResolutionChecks,
traceOutput);
// time to create configuration
--- 282,292 ----
if (Boolean.getBoolean("jdk.launcher.traceResolver"))
traceOutput = System.out;
// run the resolver to create the configuration
Configuration cf = SharedSecrets.getJavaLangModuleAccess()
! .resolveAndBind(finder,
roots,
needPostResolutionChecks,
traceOutput);
// time to create configuration
*** 378,389 ****
private static ModuleFinder limitFinder(ModuleFinder finder,
Set<String> roots,
Set<String> otherMods)
{
// resolve all root modules
! Configuration cf = Configuration.empty()
! .resolveRequires(finder,
ModuleFinder.of(),
roots);
// module name -> reference
Map<String, ModuleReference> map = new HashMap<>();
--- 387,397 ----
private static ModuleFinder limitFinder(ModuleFinder finder,
Set<String> roots,
Set<String> otherMods)
{
// resolve all root modules
! Configuration cf = Configuration.empty().resolve(finder,
ModuleFinder.of(),
roots);
// module name -> reference
Map<String, ModuleReference> map = new HashMap<>();
*** 526,537 ****
--- 534,585 ----
prefix = "jdk.module.addopens.";
Map<String, List<String>> extraOpens = decode(prefix);
if (!extraOpens.isEmpty()) {
addExtraExportsOrOpens(bootLayer, extraOpens, true);
}
+
+ // DEBUG_ADD_OPENS is for debugging purposes only
+ String home = System.getProperty("java.home");
+ Path file = Paths.get(home, "conf", "DEBUG_ADD_OPENS");
+ if (Files.exists(file)) {
+ warn(file + " detected; may break encapsulation");
+ try (Stream<String> lines = Files.lines(file)) {
+ lines.map(line -> line.trim())
+ .filter(line -> (!line.isEmpty() && !line.startsWith("#")))
+ .forEach(line -> {
+ String[] s = line.split("/");
+ if (s.length != 2) {
+ fail("Unable to parse as <module>/<package>: " + line);
+ } else {
+ String mn = s[0];
+ String pkg = s[1];
+ openPackage(bootLayer, mn, pkg);
+ }
+ });
+ } catch (IOException ioe) {
+ throw new UncheckedIOException(ioe);
+ }
+ }
}
+ private static void openPackage(Layer bootLayer, String mn, String pkg) {
+ if (mn.equals("ALL-RESOLVED") && pkg.equals("ALL-PACKAGES")) {
+ bootLayer.modules().stream().forEach(m ->
+ m.getDescriptor().packages().forEach(pn -> openPackage(m, pn)));
+ } else {
+ bootLayer.findModule(mn)
+ .filter(m -> m.getDescriptor().packages().contains(pkg))
+ .ifPresent(m -> openPackage(m, pkg));
+ }
+ }
+
+ private static void openPackage(Module m, String pn) {
+ Modules.addOpensToAllUnnamed(m, pn);
+ warn("Opened for deep reflection: " + m.getName() + "/" + pn);
+ }
+
+
private static void addExtraExportsOrOpens(Layer bootLayer,
Map<String, List<String>> map,
boolean opens)
{
String option = opens ? ADD_OPENS : ADD_EXPORTS;
< prev index next >