1

我正在通过 servlet 动态上传一个 jar 并将其保存在我的 WEB-INF/lib 目录中。我想用我的@annotation 注释所有类,

已经使用下面的反射代码没有任何运气.. jar 的清单是可读的,但类不是.. 类的列表是 0

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
ConfigurationBuilder builder = new ConfigurationBuilder().setScanners(new SubTypesScanner(false), new ResourcesScanner(),
new TypeAnnotationsScanner());
Set<URL> set = ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]));
        FilterBuilder filterBuilder = new FilterBuilder().include(FilterBuilder.prefix(exportPackage));
        Reflections reflections = new Reflections(builder.setUrls(set).filterInputsBy(filterBuilder));

        Set<Class<? extends Object>> classSet = reflections.getTypesAnnotatedWith(MyAnnotation.class);

对配置的哪些更改将有助于从动态上传的 jar 中获取类。

4

2 回答 2

0

由于您正在更新自己的WEB-INF/lib目录,因此您的上下文类加载器不一定会捕获它。顺便说一句,我认为这是一个不好的做法:行为取决于应用程序服务器,并且此目录可能不可写,如果您从战争中运行,甚至可能不存在......

所以,我将 jar 放到其他目录并使用我的自定义类加载器。这并不难。您可以使用常规 UrlClassLoader. 只需将其配置为从正确的路径读取类。完成此操作后,在创建Reflections. 看看它的 javadcoc。构造函数可以排除各种类型的参数,包括类加载器。

于 2012-12-11T13:41:10.410 回答
0

从您的侦听器类(或从任何 servletContext 可用的地方),尝试使用:

new Reflections(ClasspathHelper.forWebInfClasses(servletContext))

或者

new Reflections(ClasspathHelper.forWebInfLib(servletContext))
于 2013-03-09T16:54:30.933 回答