Perbedaan awalan classpath spring

141

Didokumentasikan di sini menyatakan

Awalan khusus ini menetapkan bahwa semua sumber daya classpath yang cocok dengan nama yang diberikan harus diperoleh (secara internal, ini pada dasarnya terjadi melalui panggilan ClassLoader.getResources (...)), dan kemudian bergabung untuk membentuk definisi konteks aplikasi akhir.

Adakah yang bisa menjelaskan hal ini?

Apa perbedaan antara menggunakan classpath*:conf/appContext.xmlsebagai lawan classpath:conf/appContext.xmltanpa tanda bintang.

JavaRocky
sumber
Pembaca masa depan, juga melihat bug ini, dengan "status = ditolak". github.com/spring-projects/spring-framework/issues/16017 Kalau-kalau URL akhirnya gagal, judul posting bug adalah "Impor file XML dari root file JAR dengan wildcard classpath dan jalur wildcard tidak bekerja [SPR-11390] "
granadaCoder

Jawaban:

207

DEFINISI SEDERHANA

Secara classpath*:conf/appContext.xmlsederhana berarti bahwa semua file appContext.xml di bawah conffolder di semua stoples Anda di classpath akan diambil dan bergabung ke dalam satu konteks aplikasi besar.

Sebaliknya, hanyaclasspath:conf/appContext.xml akan memuat satu file seperti itu ... yang pertama ditemukan di classpath Anda.

Eugene Ryzhikov
sumber
6
ada satu lagi perbedaan yang menarik di antara mereka. Lihat pertanyaan saya juga: stackoverflow.com/questions/16985770/…
Eugene
27
Satu hal yang sangat penting - jika Anda menggunakan * dan Spring tidak menemukan kecocokan, itu tidak akan mengeluh. Jika Anda tidak menggunakan * dan tidak ada yang cocok, konteksnya tidak akan mulai (!)
Roy Truelove
39

The classpath*:...sintaks berguna terutama ketika Anda ingin membangun sebuah konteks aplikasi dari beberapa file definisi kacang, menggunakan sintaks wildcard.

Sebagai contoh, jika Anda membangun konteks Anda menggunakan classpath*:appContext.xml, classpath akan dipindai untuk setiap sumber daya yang disebut appContext.xmldalam classpath, dan definisi kacang dari mereka semua digabungkan menjadi satu konteks.

Sebaliknya, classpath:conf/appContext.xmlakan memperoleh satu dan hanya satu file yang dipanggil appContext.xmldari classpath. Jika ada lebih dari satu, yang lain akan diabaikan.

skaffman
sumber
2
Akankah classpath * terlihat di subdirektori juga? Dengan kata lain, jika saya memiliki appContext.xml di root classpath dan satu di /dir/appContext.xml, apakah akan memuat keduanya ketika saya menggunakan classpath *: appContext.xml?
AHungerArtist
21

classpath *: Ini merujuk pada daftar sumber daya dan memuat semua file yang ada di classpath dan daftar dapat kosong dan jika tidak ada file seperti itu ada di classpath maka aplikasi tidak membuang pengecualian (hanya mengabaikan kesalahan).

classpath: Ini merujuk pada sumber daya tertentu dan hanya memuat file pertama yang ditemukan di classpath dan jika tidak ada file seperti itu ada di classpath itu akan mengeluarkan pengecualian

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist
Bakteri
sumber
Doc Resmi "Tidak mungkin menggunakan awalan classpath *: untuk membuat aktual Resource, sebagai sumber menunjuk ke satu sumber saja pada satu waktu." ditambah saya baru saja mendapat kesalahan aneh ini, itulah sebabnya saya berakhir di sini. Jika Anda akan mengimpor sumber daya maka tidak masuk akal untuk menggunakan awalan classpath wildcard.
GabrielOshiro
0

Kode sumber 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)};
      }
   }
}  
zzz
sumber
Bisakah Anda jelaskan?
RtmY