[英]How to retrieve some resources from external JAR file using reflections
好的,我知道类似的问题已经在这里发布,实际上,我的解决方案是从这些问题中获取的。
我的想法是要有一些模块(用户可以将模块添加到JAR文件内的文件夹中的一组XML文件中)。 这意味着用户可以将一些jar放入预定义的文件夹中,并且该JAR中的所有资源必须对应用程序可用。 为此,我需要从外部文件夹加载所有JAR,并检索XML作为资源。 JAR文件通常没有任何类文件,但是将来可能会拥有它。
该应用程序还具有一个“默认”模块,该模块已在其资源文件夹中。 这个模块运行良好,我可以使用Reflections列出其中的所有XML。
我从使用Reflection检索所有XML文件获得的代码非常简单:
final Set<String> resources = new Reflections(CustomPath.MODULES_FOLDER, new ResourcesScanner()).getResources(Pattern
.compile(".*\\.xml"));
它返回一组类似于modules_folder/module_name/file1.xml
的字符串。
加载Jar文件的代码是使用URLClassLoader :
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true); // promote the method to public access.
method.invoke(loader, new Object[] { url });
据我了解,资源可从URLClassLoader获得。 实际上,我可以执行以下操作:
URLClassLoader.getSystemResource("modules_folder/module_name/file1.xml").
然后加载文件,如果我输入了无效路径,则会引发错误。 另外,我需要知道未预定义的“ module_name”。 那不是解决方案。
如果我再次运行使用Reflection来检索资源的方法,那么它仅是检索项目的resources文件夹中的文件。 无法从JAR中检索资源。
然后,我不明白为什么反射已经无法从JAR文件中获取文件。 我不确定反射是否由于某种原因而无法访问URLCLassLoader,或者必须以其他方式使用它。
问题是...为什么反射不能从运行时加载的JAR中访问资源? 如果有限制,那么在外部JAR文件中不包含任何Java类的情况下 ,最佳方法是什么?
好的,然后将最终结果用作将来的参考。 我的问题是new Reflections(CustomPath.MODULES_FOLDER, new ResourcesScanner())
的默认构造函数无法访问URLClassLoader。 那么它不可能获得我正在寻找的资源。 一个解决方案是使用ConfigurationBuilder
并包含我需要的所有ClassLoader。
final ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addUrls(ClasspathHelper.forPackage(PathManager.MODULES_FOLDER, ClassLoader.getSystemClassLoader(),
ClasspathHelper.contextClassLoader(), ClasspathHelper.staticClassLoader()));
builder.addScanners(new ResourcesScanner());
final Reflections reflections = new Reflections(builder);
final Set<String> resources = reflections.getResources(Pattern.compile(".*\\.xml"));
从前面的代码中可以看出,我将ClassLoader.getSystemClassLoader()
添加到构建器中,并且此加载器是我用于加载Jar文件的加载器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.