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" 패턴 일치를 포함하여 다양한 기능을 수행하는 필터를 생성하고 구성하는 많은 정적 방법이 포함되어 있습니다.
리소스를 필터링하기 위한 추가 코드 예제.
다음 예제에서는 다양한 기준에 따라 리소스를 필터링하는 방법을 보여줍니다.
예제: 배치에서 이름이
지정된 모든 파일 찾기.propertiesModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));예제: 배치 및 가져오기에서 이름이 지정된 모든 파일 찾기
.propertiesModuleClassLoader 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);