@@ -32,22 +32,25 @@ public class ModuleClassLoader extends ClassLoader {
3232 public ModuleClassLoader (final String name , final Configuration configuration , final List <ModuleLayer > parentLayers ) {
3333 super (name , null );
3434 this .configuration = configuration ;
35- record JarRef (ResolvedModule m , JarModuleFinder .JarModuleReference ref ) {}
3635 this .resolvedRoots = configuration .modules ().stream ()
37- .filter ( m -> m . reference () instanceof JarModuleFinder . JarModuleReference )
38- .map ( m -> new JarRef ( m , ( JarModuleFinder .JarModuleReference ) m . reference ()) )
39- .collect (Collectors .toMap (r -> r . m ().name (), JarRef :: ref ));
36+ .map ( ResolvedModule :: reference )
37+ .filter ( JarModuleFinder .JarModuleReference . class :: isInstance )
38+ .collect (Collectors .toMap (r -> r . descriptor ().name (), r -> ( JarModuleFinder . JarModuleReference ) r ));
4039
4140 this .packageLookup = new HashMap <>();
4241 for (var mod : this .configuration .modules ()) {
43- mod .reference ().descriptor ().packages ().forEach (pk ->this .packageLookup .put (pk , mod ));
42+ if (this .resolvedRoots .containsKey (mod .name ())) {
43+ mod .reference ().descriptor ().packages ().forEach (pk ->this .packageLookup .put (pk , mod ));
44+ }
4445 }
4546
4647 this .parentLoaders = new HashMap <>();
4748 for (var rm : configuration .modules ()) {
4849 for (var other : rm .reads ()) {
4950 Supplier <ClassLoader > findClassLoader = ()->{
50- if (other .configuration () != configuration ) {
51+ // Loading a class requires its module to be part of resolvedRoots
52+ // If it's not, we delegate loading to its module's classloader
53+ if (!this .resolvedRoots .containsKey (other .name ())) {
5154 return parentLayers .stream ()
5255 .filter (l -> l .configuration () == other .configuration ())
5356 .flatMap (layer ->Optional .ofNullable (layer .findLoader (other .name ())).stream ())
0 commit comments