繁体   English   中英

如何使用反射从外部JAR文件中检索一些资源

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM