스프링 클래스 패스 접두사 차이


141

문서화 여기 가 말한다

이 특수 접두사는 주어진 이름과 일치하는 모든 클래스 경로 리소스를 가져와야하며 (내부적으로 이는 기본적으로 ClassLoader.getResources (...) 호출을 통해 발생 함) 병합 된 다음 최종 응용 프로그램 컨텍스트 정의를 형성하도록 지정합니다.

누군가 이것을 설명 할 수 있습니까?

별표 classpath*:conf/appContext.xmlclasspath:conf/appContext.xml없는 것과 반대로 사용하는 것의 차이점은 무엇입니까?


미래 독자들도 "status = declined"로이 버그를 보게됩니다. github.com/spring-projects/spring-framework/issues/16017 URL이 결국 실패 할 경우를 대비하여 버그 게시물의 제목은 "와일드 카드 클래스 경로 및 와일드 카드 경로를 가진 JAR 파일의 루트에서 XML 파일 가져 오기 작동하지 않음 [SPR-11390] "
granadaCoder

답변:


207

간단한 정의

이는 classpath*:conf/appContext.xml단순히 클래스 경로의 모든 jar에있는 폴더 아래의 모든 appContext.xml 파일이conf 하나의 큰 애플리케이션 컨텍스트로 선택되어 결합 됨을 의미합니다 .

반대로, 하나의 파일 만classpath:conf/appContext.xml 로드 합니다 . 클래스 패스에서 처음 발견 된 파일 입니다.


6
그들 사이에 또 ​​하나의 흥미로운 차이점이 있습니다. 내 질문도 참조 : stackoverflow.com/questions/16985770/…
Eugene

27
매우 중요한 것-*를 사용하고 Spring에서 일치하는 항목을 찾지 못하면 불평하지 않습니다. *를 사용하지 않고 일치하는 항목이 없으면 컨텍스트가 시작되지 않습니다 (!)
Roy Truelove

39

classpath*:...와일드 카드 구문을 사용하여 여러 빈 정의 파일에서 응용 프로그램 컨텍스트를 구축 할 때 주로 구문 유용합니다.

예를 들어,을 사용하여 컨텍스트를 구성 classpath*:appContext.xml하면 클래스 경로 appContext.xml에서 호출 된 모든 자원에 대해 클래스 경로가 스캔되고 모든 자원 의 Bean 정의가 단일 컨텍스트로 병합됩니다.

대조적으로, 클래스 경로에서 classpath:conf/appContext.xml하나의 파일 만 호출 appContext.xml됩니다. 둘 이상이 있으면 다른 것들은 무시됩니다.


2
classpath *는 하위 디렉토리에서도 볼 수 있습니까? 즉, 클래스 경로 루트에 appContext.xml이 있고 /dir/appContext.xml에 하나가 있으면 classpath * : appContext.xml을 사용할 때 둘 다로드됩니까?
AHungerArtist

21

클래스 경로 * : 그것은을 의미 자원의 목록모든 부하 등의 파일이 클래스 경로에 제시 비어있을 수 목록 및 경우에 그러한 파일이 존재하지 않는 클래스 패스에 다음 응용 프로그램 예외를 throw하지 않습니다는 (단지 오류를 무시합니다).

클래스 경로 : 그것은을 의미 특정 자원첫 번째로드 파일을 클래스 패스에 발견하고 그러한 파일을 클래스 패스에 존재하지 않는 경우는 예외가 발생합니다

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

공식 문서 "classpath * : 접두어를 사용하여 실제를 구성 할 수는 없습니다 Resource. 자원은 한 번에 하나의 자원 만 가리 키기 때문입니다." 게다가 나는이 이상한 오류를 얻었습니다. 자원을 가져 오려는 경우 와일드 카드 클래스 경로 접 두부를 사용하는 것은 의미가 없습니다.
GabrielOshiro

0

Spring의 소스 코드 :

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}  

설명해 주시겠습니까?
RtmY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.