Spring で構築され、Jboss 内で実行される Web アプリケーションがあります。実行時に、特定の注釈を持つクラスをスキャンしようとしています。現在、オープン ソースのReflections ライブラリを使用しています。
public static List<Class> scanForClassesWithAnnotation(Class<? extends Annotation> annotationClass)
{
List<Class> classesWithAnnotation = new ArrayList<>();
for(Package p : Package.getPackages())
{
LOGGER.info("scanForClassesWithAnnotation: Examining package " + p.getName());
try
{
List<ClassLoader> classLoadersList = new ArrayList<>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(
new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[classLoadersList.size()])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(p.getName()))));
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
LOGGER.info("\tscanForClassesWithAnnotation: found classes " + JsonUtils.objectToJson(classes));
for(Class foundClass : classes)
{
if(foundClass.isAnnotationPresent(annotationClass))
{
classesWithAnnotation.add(foundClass);
}
}
} catch (Exception ignored) {}
}
return classesWithAnnotation;
}
このコードを実行すると、ログに次のようなメッセージが多数表示されます。
given scan urls are empty. set urls in the configuration
このコードはスタンドアロンの Maven プロジェクトで機能するため、一般的に機能することがわかっています。しかし、問題は、コードがサーブレット コンテキストで実行されているという事実にあると思います。これを修正するにはどうすればよいですか? Spring webapp でアノテーションを使用してクラスをスキャンするにはどうすればよいですか? 前もって感謝します。