从通过servlet动态上载的jar加载类

时间:2012-12-11 13:27:12

标签: java reflection google-reflections

我通过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中获取类..

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

来自你的监听器类(或者从servletContext可用的地方),尝试使用:

new Reflections(ClasspathHelper.forWebInfClasses(servletContext))

new Reflections(ClasspathHelper.forWebInfLib(servletContext))