2011-07-10 20 views

cevap

37

Kaynakların (genellikle jar dosyaları) -classpath seçeneği kullanılarak belirtildiği sıraya göre belirtilir. Sınıfyolundaki “erken” olan kaynaklar, onlardan sonra belirtilen kaynakların önüne geçer. Bu, uygulamanızın bildirim dosyasında da ayarlanabilir ve daha sonra -classpath seçeneğini sağlamanız gerekmez. Bildirim dosyalarıyla çalışmak için these articles'u kontrol etmek isteyebilirsiniz.

"sınıfları bulunmaktadır nasıl" nin ayrıntılı açıklama JAR sınıf yolu Sınıflar bölüm arama JAR dosyaları mantığını açıklar here, bulunabilir. Bir kaynak yerleştirileceği

+0

Maven'i kullanırsam, bu onun gerçek olmayan rasgele anlamına mı geliyor? Test sırasında MANIFEST.MF'de sınıf yolu ayarlanamaz (kavanozlar yerel repodan alınır) –

+0

Maven 2.0.9'dan beri, bu işlem burada açıklandığı gibi kullanılabilir (http://stackoverflow.com/questions/793054/ maven-sınıf yolu dereceden-sayılar). – mouser

+1

Sınıf yolundaki "Kaynaklar" ın daha önce belirtilen kaynaklardan öncelikli olduğunu doğrulayan resmi belgeler. –

7

ClassLoader (ClassLoader JavaDoc'u alınan) belirler:

ClassLoader sınıfı sınıfları ve kaynak aramak için bir heyet modelini kullanır. ClassLoader'ın her bir örneği ilişkili bir üst sınıf yükleyiciye sahiptir. Bir sınıf veya kaynak bulması istendiğinde, bir ClassLoader örneği, sınıf veya kaynağı bulmaya çalışmadan önce, sınıf veya kaynak için aramayı ana sınıf yükleyicisine yönlendirir. Sanal makinenin "bootstrap sınıfı yükleyicisi" olarak adlandırılan yerleşik sınıf yükleyicinin kendisi bir üst öğeye sahip değildir, ancak bir ClassLoader örneğinin üst öğesi olarak kullanılabilir.

public URL getResource(String name) { 
    URL url; 
    if (parent != null) { 
     url = parent.getResource(name); 
    } else { 
     url = getBootstrapResource(name); 
    } 
    if (url == null) { 
     url = findResource(name); 
    } 
    return url; 
} 

nerede ClassLoader: kodunuzu Sınıf # getResource veya Sınıf # getResourceAsStream denilen her yerde

Yani, bu

public java.net.URL getResource(String name) { 
    name = resolveName(name); 
    ClassLoader cl = getClassLoader0(); 
    if (cl==null) { 
     // A system class. 
     return ClassLoader.getSystemResource(name); 
    } 
    return cl.getResource(name); 
} 

ClassLoader.java (Class.java alınmıştır) olur #findResource aslında ClassLoader uygulaması tarafından üzerine yazılacak. Bu davranış, bir uygulama sunucusunda, bir TomCat'ta veya bir jar dosyasından çalışıyorsanız, şu anda bulunduğunuz ortamın ClassLoader uygulamalarına bağlıdır.

Here, kullanabileceğiniz bir örnektir. Özel davasında başlık altında neler olup bittiğini izlemek için.

+0

Doğru, classloader bağımlı, ancak standart sınıf yükleyiciler ile Java SE kullanıyorum çünkü diğer cevap geçerlidir. –

+1

Bu, her zamanki URLClassLoader kullanıldığında, birden çok kavanoz/dizin kullanıldığında ne olacağını eklemelidir. –