// Create a Layer over the boot layer. // Define modules within this layer to test access between // publically defined classes within packages of those modules. public void createLayerOnBoot() throws Throwable { // Define module: m1 // Can read: java.base, m2 // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = new ModuleDescriptor.Builder("m1") .requires("java.base") .requires("m2") .exports("p1") .build(); // Define module: m2 // Can read: java.base // Packages: p2 // Packages exported: p2 is exported unqualifiedly ModuleDescriptor descriptor_m2 = new ModuleDescriptor.Builder("m2").requires("java.base").exports("p2").build(); // Set up a ModuleFinder containing all modules for this layer. ModuleFinder finder = ModuleLibrary.of(descriptor_m1, descriptor_m2); // Resolves "m1" Configuration cf = Layer.boot().configuration().resolveRequires(finder, ModuleFinder.of(), Set.of("m1")); // map each module to the same class loader for this test Map<String, ClassLoader> map = new HashMap<>(); map.put("m1", MySameClassLoader.loader1); map.put("m2", MySameClassLoader.loader1); // Create Layer that contains m1 & m2 Layer layer = Layer.boot().defineModules(cf, map::get); assertTrue(layer.findLoader("m1") == MySameClassLoader.loader1); assertTrue(layer.findLoader("m2") == MySameClassLoader.loader1); // now use the same loader to load class p1.c1 Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1"); try { p1_c1_class.newInstance(); } catch (IllegalAccessError e) { throw new RuntimeException( "Test Failed, an IAE should not be thrown since p2 is exported unqualifiedly."); } }