22
33import java .util .Collections ;
44import java .util .HashSet ;
5+ import java .util .List ;
56import java .util .Set ;
67import java .util .stream .Collectors ;
78import java .util .stream .Stream ;
1011import javax .ws .rs .core .Application ;
1112
1213import org .apache .maven .plugin .logging .Log ;
13- import org .reflections .Reflections ;
14- import org .reflections .scanners .ResourcesScanner ;
15- import org .reflections .scanners .SubTypesScanner ;
16- import org .reflections .scanners .TypeAnnotationsScanner ;
17- import org .reflections .util .ConfigurationBuilder ;
1814
15+ import io .github .classgraph .ClassGraph ;
16+ import io .github .classgraph .ClassInfo ;
17+ import io .github .classgraph .ClassInfoList ;
18+ import io .github .classgraph .ScanResult ;
1919import io .swagger .v3 .oas .annotations .OpenAPIDefinition ;
2020
2121/**
@@ -33,46 +33,41 @@ class JaxRSScanner {
3333 public JaxRSScanner (Log log , Set <String > resourcePackages , Boolean useResourcePackagesChildren ) {
3434 this .log = log ;
3535 this .resourcePackages = resourcePackages == null ? Collections .emptySet () : new HashSet <>(resourcePackages );
36- this .useResourcePackagesChildren = useResourcePackagesChildren != null && useResourcePackagesChildren ;
36+ this .useResourcePackagesChildren = Boolean . TRUE . equals ( useResourcePackagesChildren ) ;
3737 }
3838
3939 Application applicationInstance () {
40- ConfigurationBuilder config = ConfigurationBuilder
41- .build (resourcePackages )
42- .setScanners (new ResourcesScanner (), new TypeAnnotationsScanner (), new SubTypesScanner ());
43- Reflections reflections = new Reflections (config );
44- Set <Class <? extends Application >> applicationClasses = reflections .getSubTypesOf (Application .class )
45- .stream ()
46- .filter (this ::filterClassByResourcePackages )
47- .collect (Collectors .toSet ());
48- if (applicationClasses .isEmpty ()) {
49- return null ;
40+ ClassGraph classGraph = new ClassGraph ().enableClassInfo ();
41+ try (ScanResult scanResult = classGraph .scan ()) {
42+ List <ClassInfo > applicationClasses = scanResult .getSubclasses (Application .class .getName ()).stream ()
43+ .filter (this ::filterClassByResourcePackages )
44+ .collect (Collectors .toList ());
45+ if (applicationClasses .size () == 1 ) {
46+ return ClassUtils .createInstance (applicationClasses .get (0 ).loadClass (Application .class ));
47+ }
48+ if (applicationClasses .size () > 1 ) {
49+ log .warn ("More than one javax.ws.rs.core.Application classes found on the classpath, skipping" );
50+ }
5051 }
51- if (applicationClasses .size () > 1 ) {
52- log .warn ("More than one javax.ws.rs.core.Application classes found on the classpath, skipping" );
53- return null ;
54- }
55- return ClassUtils .createInstance (applicationClasses .iterator ().next ());
52+ return null ;
5653 }
5754
5855 Set <Class <?>> classes () {
59- ConfigurationBuilder config = ConfigurationBuilder
60- .build (resourcePackages )
61- .setScanners (new ResourcesScanner (), new TypeAnnotationsScanner (), new SubTypesScanner ());
62- Reflections reflections = new Reflections (config );
63- Stream <Class <?>> apiClasses = reflections .getTypesAnnotatedWith (Path .class )
64- .stream ()
65- .filter (this ::filterClassByResourcePackages );
66- Stream <Class <?>> defClasses = reflections .getTypesAnnotatedWith (OpenAPIDefinition .class )
67- .stream ()
68- .filter (this ::filterClassByResourcePackages );
69- return Stream .concat (apiClasses , defClasses ).collect (Collectors .toSet ());
56+ ClassGraph classGraph = new ClassGraph ().enableClassInfo ().enableAnnotationInfo ();
57+ try (ScanResult scanResult = classGraph .scan ()) {
58+ ClassInfoList apiClasses = scanResult .getClassesWithAnnotation (Path .class .getName ());
59+ ClassInfoList defClasses = scanResult .getClassesWithAnnotation (OpenAPIDefinition .class .getName ());
60+ return Stream .concat (apiClasses .stream (), defClasses .stream ())
61+ .filter (this ::filterClassByResourcePackages )
62+ .map (ClassInfo ::loadClass )
63+ .collect (Collectors .toSet ());
64+ }
7065 }
7166
72- private boolean filterClassByResourcePackages (Class <?> cls ) {
67+ private boolean filterClassByResourcePackages (ClassInfo cls ) {
7368 return resourcePackages .isEmpty ()
74- || resourcePackages .contains (cls .getPackage (). getName ())
75- || (useResourcePackagesChildren && resourcePackages .stream ().anyMatch (p -> cls .getPackage (). getName ().startsWith (p )));
69+ || resourcePackages .contains (cls .getPackageName ())
70+ || (useResourcePackagesChildren && resourcePackages .stream ().anyMatch (p -> cls .getPackageName ().startsWith (p )));
7671 }
7772
7873}
0 commit comments