복붙노트

[SPRING] JAR의 PathMatchingResourcePatternResolver 및 URLClassloader를 사용하여 리소스 찾기

SPRING

JAR의 PathMatchingResourcePatternResolver 및 URLClassloader를 사용하여 리소스 찾기

URLClassloader를 사용하여 런타임에 동적으로로드되는 특정 파일 확장명으로 모든 리소스를로드하려고합니다.

불행히도 PathMatchingResourcePatternResolver는 classpath * : / *. myextension 패턴을 사용할 때 리소스를 반환하지 않습니다. classpath * : / test.myextension과 같은 완전한 이름의 파일을 지정하면 리소스가로드되므로 Classloader가 올바르게 구성되어 있다고 생각합니다.

URLClassloader classloader = new URLClassloader(jarURLs); // jarURLs look like "file:C:/Temp/test.jar"
Thread.getCurrentThread().setContextClassloader(classloader)
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classloader);
Resource[] resources = resolver.getResources("classpath*:/*.myextension") // yields empty array
....

어떻게해야합니까? jars를 동적으로로드해야하고 사전에 리소스 이름을 모른다.

해결법

  1. ==============================

    1.스프링에서 파일을 동적으로로드하는 것은 간단합니다. 확장자가있는 파일을 찾는 방법을 변경했습니다.

    스프링에서 파일을 동적으로로드하는 것은 간단합니다. 확장자가있는 파일을 찾는 방법을 변경했습니다.

    다음을 시도하십시오.

    ClassLoader cl = this.getClass().getClassLoader(); 
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
    Resource[] resources = resolver.getResources("classpath*:/*.xml") ;
    for (Resource resource: resources){
        logger.info(resource.getFilename());
    }
    
  2. ==============================

    2.Tech Trip이 그의 대답에 대한 언급에서 언급했듯이 나는 나의 패턴에 오류가 있었다. 앤트 스타일 패턴과 결합 될 때 "classpath * :"는 패턴이 시작되기 전에 최소한 하나의 루트 디렉토리에서만 안정적으로 작동합니다 ... JDK의 ClassLoader.getResources ()

    Tech Trip이 그의 대답에 대한 언급에서 언급했듯이 나는 나의 패턴에 오류가 있었다. 앤트 스타일 패턴과 결합 될 때 "classpath * :"는 패턴이 시작되기 전에 최소한 하나의 루트 디렉토리에서만 안정적으로 작동합니다 ... JDK의 ClassLoader.getResources ()

    그래서 내 패턴을

    classpath*/model/*.myextension
    

    JAR은 xText-DSL에서 생성되므로 모델 폴더를 사용해야한다는 규칙을 시행해야합니다.

  3. from https://stackoverflow.com/questions/25405167/finding-resources-with-pathmatchingresourcepatternresolver-and-urlclassloader-in by cc-by-sa and MIT license