3.6.2. 배포에서 프로그래밍 방식으로 리소스 반복

JBoss 모듈 라이브러리는 모든 배포 리소스를 반복하기 위한 여러 API를 제공합니다. JBoss Modules API용 JavaDoc은 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());
  • 패턴과 일치하는 모든 리소스를 찾습니다.

    배포 내에서 또는 배포의 전체 가져오기 세트 내에서 특정 리소스만 찾아야 하는 경우 리소스 반복을 필터링해야 합니다. API를 필터링하는 JBoss 모듈은 이 작업을 수행할 수 있는 몇 가지 툴을 제공합니다.

    • 전체 종속성 세트를 검사합니다.

      전체 종속성 세트를 검사해야 하는 경우 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);