我通过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中获取类..
答案 0 :(得分:0)
由于您正在更新自己的WEB-INF/lib
目录,因此您的上下文类加载器不一定会捕获它。 BTW我认为这是一个不好的做法:行为取决于应用程序服务器,这个目录可能不可写,如果你从战争中运行,甚至可能不存在......
所以,我将jar放到其他目录并使用我的自定义类加载器。这并不难。您可以使用常规UrlClassLoader
。只需将其配置为从正确的路径读取类。完成此操作后,在创建Reflections
实例时,请传递此类加载器。看看它的javadcoc。构造函数可以包括各种类型的参数,包括类加载器。
答案 1 :(得分:0)
来自你的监听器类(或者从servletContext可用的地方),尝试使用:
new Reflections(ClasspathHelper.forWebInfClasses(servletContext))
或
new Reflections(ClasspathHelper.forWebInfLib(servletContext))