@@ -248,6 +248,41 @@ public ClassLoader getClassLoader() {
248
248
return classLoader ;
249
249
}
250
250
251
+ private static ModuleFinder upgradeAndSystemModuleFinder ;
252
+
253
+ /**
254
+ * Creates a finder from a module path specified by the {@code prop} system property.
255
+ */
256
+ private static ModuleFinder finderFor (String prop ) {
257
+ String s = System .getProperty (prop );
258
+ if (s == null || s .isEmpty ()) {
259
+ return null ;
260
+ } else {
261
+ String [] dirs = s .split (File .pathSeparator );
262
+ Path [] paths = new Path [dirs .length ];
263
+ int i = 0 ;
264
+ for (String dir : dirs ) {
265
+ paths [i ++] = Path .of (dir );
266
+ }
267
+ return ModuleFinder .of (paths );
268
+ }
269
+ }
270
+
271
+ /**
272
+ * Gets a finder that locates the upgrade modules and the system modules, in that order.
273
+ */
274
+ private static ModuleFinder getUpgradeAndSystemModuleFinder () {
275
+ if (upgradeAndSystemModuleFinder == null ) {
276
+ ModuleFinder finder = ModuleFinder .ofSystem ();
277
+ ModuleFinder upgradeModulePath = finderFor ("jdk.module.upgrade.path" );
278
+ if (upgradeModulePath != null ) {
279
+ finder = ModuleFinder .compose (upgradeModulePath , finder );
280
+ }
281
+ upgradeAndSystemModuleFinder = finder ;
282
+ }
283
+ return upgradeAndSystemModuleFinder ;
284
+ }
285
+
251
286
private class ClassInitWithModules extends ClassInit {
252
287
253
288
ClassInitWithModules (ForkJoinPool executor , ImageClassLoader imageClassLoader ) {
@@ -260,7 +295,7 @@ protected void init() {
260
295
"jdk.internal.vm.ci" , "jdk.internal.vm.compiler" , "com.oracle.graal.graal_enterprise" ,
261
296
"org.graalvm.sdk" , "org.graalvm.truffle" );
262
297
263
- for (ModuleReference moduleReference : ModuleFinder . ofSystem ().findAll ()) {
298
+ for (ModuleReference moduleReference : getUpgradeAndSystemModuleFinder ().findAll ()) {
264
299
if (requiresInit .contains (moduleReference .descriptor ().name ())) {
265
300
initModule (moduleReference );
266
301
}
0 commit comments