3.6.2. 编程化部署中的资源

JBoss 模块库为迭代所有部署资源提供了多个 API。JBoss 模块 API 的 Java 文档位于以下位置:http://docs.jboss.org/jbossmodules/1.3.0.Final/api/.要使用这些 API,您必须在 MANIFEST.MF 中添加以下依赖项:

Dependencies: org.jboss.modules

务必要注意,尽管这些 API 提供了更大的灵活性,但它们的运行也比直接路径查找慢得多。

本节介绍了您可以编程化地迭代应用程序代码中的资源的一些方法。

  • 列出部署中和所有导入中的资源。

    有时无法通过确切的路径查找资源。例如,确切的路径可能未知,或者您可能需要检查给定路径中的多个文件。在本例中,JBoss 模块库为迭代所有部署资源提供了多个 API。您可以使用以下两种方法之一迭代部署中的资源:

    • 迭代单一模块中找到的所有资源。

      ModuleClassLoader.iterateResources() 方法迭代此模块类加载程序中的所有资源。此方法采用两个参数:要搜索的起始目录名和一个布尔值,指定它是否应递归到子目录中。

      以下示例演示了如何获取 ModuleClassLoader 并获取 bin/ 目录中资源的迭代器,并递归到子目录。

      ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
      Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);

      生成的迭代器可用于检查每个匹配资源并查询其名称和大小(如果可用),打开可读流,或获取资源的 URL。

    • 迭代单一模块和导入的资源中找到的所有资源。

      Module.iterateResources() 方法迭代此模块类加载程序中的所有资源,包括导入模块中的资源。此方法返回的集合比之前的方法大得多。这个方法需要一个参数,它是将结果缩小到特定模式的过滤器。或者,也可以提供 PathFilters.acceptAll()来返回整个集合。

      以下示例演示了如何在此模块中查找整个资源集合,包括导入。

      ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
      Module module = moduleClassLoader.getModule();
      Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());
  • 查找与某一模式匹配的所有资源。

    如果您只需要在部署中或部署的完整导入集中找到特定资源,则需要过滤资源迭代。JBoss 模块过滤 API 为您提供了多个工具来实现这一目标:

    • 检查完整的依赖项。

      如果您需要检查完整的依赖项集合,您可以使用 Module.iterateResources() 方法的 PathFilter 参数检查每个资源的匹配名称。

    • 检查部署依赖项。

      如果您只需要在部署中查看,请使用 ModuleClassLoader.iterateResources() 方法。但是,您必须使用其他方法过滤生成的迭代器。PathFilters.filtered() 方法可以提供本例中资源迭代器的过滤视图。PathFilters 类包含许多静态方法,用于创建和编写可执行各种功能的过滤器,包括查找子路径或精确匹配项或匹配 Ant 风格的"glob"模式。

  • 过滤资源的其他代码示例。

    以下示例演示了如何根据不同的条件过滤资源。

    示例:查找所有文件命名 的消息.properties( 在您的部署中)

    ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
    Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));

    示例:在您的部署和导入中查找所有文件命名 的消息.properties

    ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
    Module module = moduleClassLoader.getModule();
    Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties"));

    示例:查找任何在您的部署中命名 my-resources 的所有文件

    ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
    Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));

    示例:查找部署和导入中 的所有文件命名 的消息 或错误

    ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
    Module module = moduleClassLoader.getModule();
    Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));

    示例:查找部署中特定软件包中的所有文件

    ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader();
    Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);