< prev index next >
src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java
Print this page
@@ -31,10 +31,11 @@
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.LayerInstantiationException;
import java.lang.reflect.Module;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -44,11 +45,10 @@
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;
@@ -325,12 +325,13 @@
resolvedModule.reference().descriptor();
String name = descriptor.name();
for (String p : descriptor.packages()) {
String other = packageToModule.putIfAbsent(p, name);
if (other != null) {
- fail("Package " + p + " in both module "
- + name + " and module " + other);
+ String msg = "Package " + p + " in both module "
+ + name + " and module " + other;
+ throw new LayerInstantiationException(msg);
}
}
}
}
@@ -357,11 +358,11 @@
}
PerfCounters.loadModulesTime.addElapsedTimeFrom(t5);
- // --add-reads, -add-exports/-add-opens
+ // --add-reads, --add-exports/--add-opens
addExtraReads(bootLayer);
addExtraExportsAndOpens(bootLayer);
// total time to initialize
PerfCounters.bootstrapTime.addElapsedTimeFrom(t0);
@@ -512,32 +513,51 @@
/**
* Process the --add-exports and --add-opens options to export/open
* additional packages specified on the command-line.
*/
private static void addExtraExportsAndOpens(Layer bootLayer) {
+ IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder();
// --add-exports
String prefix = "jdk.module.addexports.";
Map<String, List<String>> extraExports = decode(prefix);
if (!extraExports.isEmpty()) {
- addExtraExportsOrOpens(bootLayer, extraExports, false);
+ addExtraExportsOrOpens(bootLayer, extraExports, false, builder);
}
// --add-opens
prefix = "jdk.module.addopens.";
Map<String, List<String>> extraOpens = decode(prefix);
if (!extraOpens.isEmpty()) {
- addExtraExportsOrOpens(bootLayer, extraOpens, true);
+ addExtraExportsOrOpens(bootLayer, extraOpens, true, builder);
}
+ // --permit-illegal-access
+ if (getAndRemoveProperty("jdk.module.permitIllegalAccess") != null) {
+ warn("--permit-illegal-access will be removed in the next major release");
+ bootLayer.modules().stream().forEach(m -> {
+ m.getDescriptor()
+ .packages()
+ .stream()
+ .filter(pn -> !m.isOpen(pn))
+ .forEach(pn -> {
+ builder.logAccessToOpenPackage(m, pn, "--permit-illegal-access");
+ Modules.addOpensToAllUnnamed(m, pn);
+ });
+ });
+ }
+
+ IllegalAccessLogger.setIllegalAccessLogger(builder.build());
}
private static void addExtraExportsOrOpens(Layer bootLayer,
Map<String, List<String>> map,
- boolean opens)
+ boolean opens,
+ IllegalAccessLogger.Builder builder)
{
String option = opens ? ADD_OPENS : ADD_EXPORTS;
+ //warn(map.size() + " usage(s) of " + option);
for (Map.Entry<String, List<String>> e : map.entrySet()) {
// the key is $MODULE/$PACKAGE
String key = e.getKey();
String[] s = key.split("/");
@@ -579,12 +599,14 @@
continue;
}
}
if (allUnnamed) {
if (opens) {
+ builder.logAccessToOpenPackage(m, pn, option);
Modules.addOpensToAllUnnamed(m, pn);
} else {
+ builder.logAccessToExportedPackage(m, pn, option);
Modules.addExportsToAllUnnamed(m, pn);
}
} else {
if (opens) {
Modules.addOpens(m, pn, other);
@@ -630,11 +652,11 @@
if (rhs.isEmpty())
fail(unableToParse(option(prefix), "<module>=<value>", value));
// value is <module>(,<module>)* or <file>(<pathsep><file>)*
if (!allowDuplicates && map.containsKey(key))
- fail(key + " specified more than once in " + option(prefix));
+ fail(key + " specified more than once to " + option(prefix));
List<String> values = map.computeIfAbsent(key, k -> new ArrayList<>());
int ntargets = 0;
for (String s : rhs.split(regex)) {
if (s.length() > 0) {
values.add(s);
@@ -674,14 +696,10 @@
String incubating = null;
for (ResolvedModule rm : cf.modules()) {
ModuleReference mref = rm.reference();
String mn = mref.descriptor().name();
- // emit warning if module name ends with a non-Java letter
- if (!Checks.hasLegalModuleNameLastCharacter(mn))
- warn("Module name \"" + mn + "\" may soon be illegal");
-
// emit warning if the WARN_INCUBATING module resolution bit set
if (ModuleResolution.hasIncubatingWarning(mref)) {
if (incubating == null) {
incubating = mn;
} else {
@@ -703,11 +721,11 @@
static void warn(String m) {
System.err.println("WARNING: " + m);
}
static void warnUnknownModule(String option, String mn) {
- warn("Unknown module: " + mn + " specified in " + option);
+ warn("Unknown module: " + mn + " specified to " + option);
}
static String unableToParse(String option, String text, String value) {
return "Unable to parse " + option + " " + text + ": " + value;
}
< prev index next >