42
42
import static java .util .Arrays .asList ;
43
43
44
44
/**
45
- *
46
45
* @author Robert Scholte
47
46
* @since 3.0.0
48
47
*/
49
48
class URLClassLoaderBuilder {
50
49
private Log logger ;
50
+ private List <String > forcedJvmPackages ;
51
+ private List <String > excludedJvmPackages ;
51
52
private Collection <Path > paths ;
52
53
private Collection <String > exclusions ;
53
54
private ClassFileTransformer transformer ;
@@ -58,6 +59,16 @@ static URLClassLoaderBuilder builder() {
58
59
return new URLClassLoaderBuilder ();
59
60
}
60
61
62
+ URLClassLoaderBuilder setExcludedJvmPackages (List <String > excludedJvmPackages ) {
63
+ this .excludedJvmPackages = excludedJvmPackages ;
64
+ return this ;
65
+ }
66
+
67
+ URLClassLoaderBuilder setForcedJvmPackages (List <String > forcedJvmPackages ) {
68
+ this .forcedJvmPackages = forcedJvmPackages ;
69
+ return this ;
70
+ }
71
+
61
72
public URLClassLoaderBuilder setTransformer (final ClassFileTransformer transformer ) {
62
73
this .transformer = transformer ;
63
74
return this ;
@@ -96,7 +107,7 @@ URLClassLoader build() throws IOException {
96
107
}
97
108
}
98
109
99
- return new ExecJavaClassLoader (urls .toArray (new URL [0 ]), transformer , logger );
110
+ return new ExecJavaClassLoader (urls .toArray (new URL [0 ]), transformer , forcedJvmPackages , excludedJvmPackages );
100
111
}
101
112
102
113
// child first strategy
@@ -110,14 +121,20 @@ private static class ExecJavaClassLoader extends URLClassLoader {
110
121
}
111
122
112
123
private final String jre ;
113
- private final Log logger ;
114
124
private final ClassFileTransformer transformer ;
115
-
116
- public ExecJavaClassLoader (final URL [] urls , final ClassFileTransformer transformer , final Log logger ) {
125
+ private final List <String > forcedJvmPackages ;
126
+ private final List <String > excludedJvmPackages ;
127
+
128
+ public ExecJavaClassLoader (
129
+ URL [] urls ,
130
+ ClassFileTransformer transformer ,
131
+ List <String > forcedJvmPackages ,
132
+ List <String > excludedJvmPackages ) {
117
133
super (urls );
118
134
this .jre = getJre ();
119
- this .logger = logger ;
120
135
this .transformer = transformer ;
136
+ this .forcedJvmPackages = forcedJvmPackages ;
137
+ this .excludedJvmPackages = excludedJvmPackages ;
121
138
}
122
139
123
140
@ Override
@@ -307,130 +324,101 @@ private boolean postLoad(boolean resolve, Class<?> clazz) {
307
324
return false ;
308
325
}
309
326
310
- // not all jvm classes, for ex "javax" can be overriden so don't list it here
327
+ // not all jvm classes, for ex "javax" can be overridden so don't list it them all here (javax.resource for ex)
311
328
private boolean isDirectJvmClass (final String name ) {
329
+ if (excludedJvmPackages != null && excludedJvmPackages .stream ().anyMatch (name ::startsWith )) {
330
+ return false ;
331
+ }
312
332
if (name .startsWith ("java." )) {
313
333
return true ;
314
- }
315
- if (name .startsWith ("sun." )) {
334
+ } else if (name .startsWith ("javax." )) {
335
+ final String sub = name .substring ("javax." .length ());
336
+ if (sub .startsWith ("xml." )) {
337
+ return true ;
338
+ }
339
+ } else if (name .startsWith ("sun." )) {
316
340
return true ;
317
- }
318
- if (name .startsWith ("jdk." )) {
341
+ } else if (name .startsWith ("jdk." )) {
319
342
return true ;
320
- }
321
- if (name .startsWith ("oracle." )) {
343
+ } else if (name .startsWith ("oracle." )) {
322
344
return true ;
323
- }
324
- if (name .startsWith ("javafx." )) {
345
+ } else if (name .startsWith ("javafx." )) {
325
346
return true ;
326
- }
327
- if (name .startsWith ("netscape." )) {
347
+ } else if (name .startsWith ("netscape." )) {
328
348
return true ;
329
- }
330
- if (name .startsWith ("org." )) {
349
+ } else if (name .startsWith ("org." )) {
331
350
final String sub = name .substring ("org." .length ());
332
351
if (sub .startsWith ("w3c.dom." )) {
333
352
return true ;
334
- }
335
- if (sub .startsWith ("omg." )) {
353
+ } else if (sub .startsWith ("omg." )) {
336
354
return true ;
337
- }
338
- if (sub .startsWith ("xml.sax." )) {
355
+ } else if (sub .startsWith ("xml.sax." )) {
339
356
return true ;
340
- }
341
- if (sub .startsWith ("ietf.jgss." )) {
357
+ } else if (sub .startsWith ("ietf.jgss." )) {
342
358
return true ;
343
- }
344
- if (sub .startsWith ("jcp.xml.dsig.internal." )) {
359
+ } else if (sub .startsWith ("jcp.xml.dsig.internal." )) {
345
360
return true ;
346
361
}
347
- }
348
- if (name .startsWith ("com." )) {
362
+ } else if (name .startsWith ("com." )) {
349
363
final String sub = name .substring ("com." .length ());
350
364
if (sub .startsWith ("oracle." )) {
351
365
return true ;
352
- }
353
- if (sub .startsWith ("sun." )) {
366
+ } else if (sub .startsWith ("sun." )) {
354
367
final String subSun = sub .substring ("sun." .length ());
355
368
if (subSun .startsWith ("accessibility." )) {
356
369
return true ;
357
- }
358
- if (subSun .startsWith ("activation." )) {
370
+ } else if (subSun .startsWith ("activation." )) {
359
371
return true ;
360
- }
361
- if (subSun .startsWith ("awt." )) {
372
+ } else if (subSun .startsWith ("awt." )) {
362
373
return true ;
363
- }
364
- if (subSun .startsWith ("beans." )) {
374
+ } else if (subSun .startsWith ("beans." )) {
365
375
return true ;
366
- }
367
- if (subSun .startsWith ("corba.se." )) {
376
+ } else if (subSun .startsWith ("corba.se." )) {
368
377
return true ;
369
- }
370
- if (subSun .startsWith ("demo.jvmti." )) {
378
+ } else if (subSun .startsWith ("demo.jvmti." )) {
371
379
return true ;
372
- }
373
- if (subSun .startsWith ("image.codec.jpeg." )) {
380
+ } else if (subSun .startsWith ("image.codec.jpeg." )) {
374
381
return true ;
375
- }
376
- if (subSun .startsWith ("imageio." )) {
382
+ } else if (subSun .startsWith ("imageio." )) {
377
383
return true ;
378
- }
379
- if (subSun .startsWith ("istack.internal." )) {
384
+ } else if (subSun .startsWith ("istack.internal." )) {
380
385
return true ;
381
- }
382
- if (subSun .startsWith ("java." )) {
386
+ } else if (subSun .startsWith ("java." )) {
383
387
return true ;
384
- }
385
- if (subSun .startsWith ("java_cup." )) {
388
+ } else if (subSun .startsWith ("java_cup." )) {
386
389
return true ;
387
- }
388
- if (subSun .startsWith ("jmx." )) {
390
+ } else if (subSun .startsWith ("jmx." )) {
389
391
return true ;
390
- }
391
- if (subSun .startsWith ("jndi." )) {
392
+ } else if (subSun .startsWith ("jndi." )) {
392
393
return true ;
393
- }
394
- if (subSun .startsWith ("management." )) {
394
+ } else if (subSun .startsWith ("management." )) {
395
395
return true ;
396
- }
397
- if (subSun .startsWith ("media.sound." )) {
396
+ } else if (subSun .startsWith ("media.sound." )) {
398
397
return true ;
399
- }
400
- if (subSun .startsWith ("naming.internal." )) {
398
+ } else if (subSun .startsWith ("naming.internal." )) {
401
399
return true ;
402
- }
403
- if (subSun .startsWith ("net." )) {
400
+ } else if (subSun .startsWith ("net." )) {
404
401
return true ;
405
- }
406
- if (subSun .startsWith ("nio." )) {
402
+ } else if (subSun .startsWith ("nio." )) {
407
403
return true ;
408
- }
409
- if (subSun .startsWith ("org." )) {
404
+ } else if (subSun .startsWith ("org." )) {
410
405
return true ;
411
- }
412
- if (subSun .startsWith ("rmi.rmid." )) {
406
+ } else if (subSun .startsWith ("rmi.rmid." )) {
413
407
return true ;
414
- }
415
- if (subSun .startsWith ("rowset." )) {
408
+ } else if (subSun .startsWith ("rowset." )) {
416
409
return true ;
417
- }
418
- if (subSun .startsWith ("security." )) {
410
+ } else if (subSun .startsWith ("security." )) {
419
411
return true ;
420
- }
421
- if (subSun .startsWith ("swing." )) {
412
+ } else if (subSun .startsWith ("swing." )) {
422
413
return true ;
423
- }
424
- if (subSun .startsWith ("tracing." )) {
414
+ } else if (subSun .startsWith ("tracing." )) {
425
415
return true ;
426
- }
427
- if (subSun .startsWith ("xml.internal." )) {
416
+ } else if (subSun .startsWith ("xml.internal." )) {
428
417
return true ;
429
418
}
430
- return false ;
431
419
}
432
420
}
433
- return false ;
421
+ return forcedJvmPackages != null && forcedJvmPackages . stream (). anyMatch ( name :: startsWith ) ;
434
422
}
435
423
436
424
private class FilteringUrlEnum implements Enumeration <URL > {
0 commit comments