diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index a839f56b56..965cb195bf 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -30,6 +30,16 @@
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ io.github.classgraph
+ classgraph
+ ${classgraph.version}
+
org.jbpm
jbpm-test
@@ -38,6 +48,8 @@
+ 3.6.2
+ 4.8.22
6.0.0.Final
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/ClassGraphUnitTest.java b/libraries-2/src/test/java/com/baeldung/classgraph/ClassGraphUnitTest.java
new file mode 100644
index 0000000000..3dc99e6a32
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/ClassGraphUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.classgraph;
+
+import io.github.classgraph.*;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.function.Consumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ClassGraphUnitTest {
+
+ @Test
+ public void whenClassAnnotationFilterIsDefined_thenTargetClassesCanBeFound() {
+ doTest(result -> {
+ ClassInfoList classInfos = result.getClassesWithAnnotation(TestAnnotation.class.getName());
+ assertThat(classInfos).extracting(ClassInfo::getName).contains(ClassWithAnnotation.class.getName());
+ });
+ }
+
+ @Test
+ public void whenMethodAnnotationFilterIsDefined_thenTargetClassesCanBeFound() {
+ doTest(result -> {
+ ClassInfoList classInfos = result.getClassesWithMethodAnnotation(TestAnnotation.class.getName());
+ assertThat(classInfos).extracting(ClassInfo::getName).contains(MethodWithAnnotation.class.getName());
+ });
+ }
+
+ @Test
+ public void whenMethodAnnotationValueFilterIsDefined_thenTargetClassesCanBeFound() {
+ doTest(result -> {
+ ClassInfoList classInfos = result.getClassesWithMethodAnnotation(TestAnnotation.class.getName());
+ ClassInfoList filteredClassInfos = classInfos.filter(classInfo -> {
+ return classInfo.getMethodInfo().stream().anyMatch(methodInfo -> {
+ AnnotationInfo annotationInfo = methodInfo.getAnnotationInfo(TestAnnotation.class.getName());
+ if (annotationInfo == null) {
+ return false;
+ }
+
+ return "web".equals(annotationInfo.getParameterValues().getValue("value"));
+ });
+ });
+ assertThat(filteredClassInfos)
+ .extracting(ClassInfo::getName)
+ .contains(MethodWithAnnotationParameterWeb.class.getName());
+ });
+ }
+
+ @Test
+ public void whenFieldAnnotationFilterIsDefined_thenTargetClassesCanBeFound() {
+ doTest(result -> {
+ ClassInfoList classInfos = result.getClassesWithFieldAnnotation(TestAnnotation.class.getName());
+ assertThat(classInfos).extracting(ClassInfo::getName).contains(FieldWithAnnotation.class.getName());
+ });
+ }
+
+ @Test
+ public void whenResourceIsUsed_thenItCanBeFoundAndLoaded() throws IOException {
+ try (ScanResult result = new ClassGraph().whitelistPaths("classgraph").scan()) {
+ ResourceList resources = result.getResourcesWithExtension("config");
+ assertThat(resources).extracting(Resource::getPath).containsOnly("classgraph/my.config");
+ assertThat(resources.get(0).getContentAsString()).isEqualTo("my data");
+ }
+ }
+
+ private void doTest(Consumer checker) {
+ try (ScanResult result = new ClassGraph().enableAllInfo()
+ .whitelistPackages(getClass().getPackage().getName())
+ .scan())
+ {
+ checker.accept(result);
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/ClassWithAnnotation.java b/libraries-2/src/test/java/com/baeldung/classgraph/ClassWithAnnotation.java
new file mode 100644
index 0000000000..fe476769a6
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/ClassWithAnnotation.java
@@ -0,0 +1,5 @@
+package com.baeldung.classgraph;
+
+@TestAnnotation
+public class ClassWithAnnotation {
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/FieldWithAnnotation.java b/libraries-2/src/test/java/com/baeldung/classgraph/FieldWithAnnotation.java
new file mode 100644
index 0000000000..f72a7621f9
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/FieldWithAnnotation.java
@@ -0,0 +1,7 @@
+package com.baeldung.classgraph;
+
+public class FieldWithAnnotation {
+
+ @TestAnnotation
+ private String s;
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotation.java b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotation.java
new file mode 100644
index 0000000000..29a59c09ea
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotation.java
@@ -0,0 +1,8 @@
+package com.baeldung.classgraph;
+
+public class MethodWithAnnotation {
+
+ @TestAnnotation
+ public void service() {
+ }
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterDao.java b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterDao.java
new file mode 100644
index 0000000000..f01c2743eb
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterDao.java
@@ -0,0 +1,8 @@
+package com.baeldung.classgraph;
+
+public class MethodWithAnnotationParameterDao {
+
+ @TestAnnotation("dao")
+ public void service() {
+ }
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterWeb.java b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterWeb.java
new file mode 100644
index 0000000000..bf01f7d23c
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/MethodWithAnnotationParameterWeb.java
@@ -0,0 +1,8 @@
+package com.baeldung.classgraph;
+
+public class MethodWithAnnotationParameterWeb {
+
+ @TestAnnotation("web")
+ public void service() {
+ }
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/classgraph/TestAnnotation.java b/libraries-2/src/test/java/com/baeldung/classgraph/TestAnnotation.java
new file mode 100644
index 0000000000..e3f5df92ed
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/classgraph/TestAnnotation.java
@@ -0,0 +1,14 @@
+package com.baeldung.classgraph;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+
+@Target({TYPE, METHOD, FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TestAnnotation {
+
+ String value() default "";
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/resources/classgraph/my.config b/libraries-2/src/test/resources/classgraph/my.config
new file mode 100644
index 0000000000..b99df573f6
--- /dev/null
+++ b/libraries-2/src/test/resources/classgraph/my.config
@@ -0,0 +1 @@
+my data
\ No newline at end of file