Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从通过servlet动态上传的jar加载类_Java_Reflection_Reflections - Fatal编程技术网

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

Java 从通过servlet动态上传的jar加载类,java,reflection,reflections,Java,Reflection,Reflections,我正在通过servlet动态上传一个jar,并将其保存在我的WEB-INF/lib目录中。 我想用@annotation注释所有类 在没有任何运气的情况下使用了下面的代码。。jar的清单是可读的,但类不是。。类的列表为0 List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); classLoadersList.add(ClasspathHelper.contextClassLoader());

我正在通过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);
List classLoadersList=newlinkedlist();
添加(ClasspathHelper.contextClassLoader());
添加(ClasspathHelper.staticClassLoader());
ConfigurationBuilder=new ConfigurationBuilder(),
新类型AnnotationsCanner());
Set Set=ClasspathHelper.forClassLoader(classLoaderList.toArray(新类加载器[0]);
FilterBuilder FilterBuilder=新的FilterBuilder()。包括(FilterBuilder.prefix(exportPackage));
反射反射=新反射(builder.setURL(set.filterInputsBy(filterBuilder));

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

因此,我将jar放在另一个目录中,并使用我的自定义类加载器。这并不难。您可以使用常规的
UrlClassLoader
。只需将其配置为从正确的路径读取类。完成后,在创建
反射的实例时传递该类加载器。看看它的javadcoc。构造函数可以删除各种类型的参数,包括类加载器

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

new Reflections(ClasspathHelper.forWebInfClasses(servletContext))


我创建了一个UrlClassLoader并将其添加到ClassLoaderList中,但问题仍然存在。。尝试加载类会引发ClassNotFoundException。。我还将jar从库中分离出来,没有将上传的jar存储在单独的文件夹中。。你能帮我介绍一下带有反射的urlclassloader的示例代码吗。。?
new Reflections(ClasspathHelper.forWebInfLib(servletContext))