Sınıf yolunda aynı ada sahip birden fazla dosyam varsa (ör. log4j.properties
ile birden çok .jar
sahibim), JVM kuralları hangisini seçti?Java: JVM sınıf yolunda birden fazla kaynaktan hangisi alınır?
cevap
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
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.
Doğru, classloader bağımlı, ancak standart sınıf yükleyiciler ile Java SE kullanıyorum çünkü diğer cevap geçerlidir. –
Bu, her zamanki URLClassLoader kullanıldığında, birden çok kavanoz/dizin kullanıldığında ne olacağını eklemelidir. –
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) –
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
Sınıf yolundaki "Kaynaklar" ın daha önce belirtilen kaynaklardan öncelikli olduğunu doğrulayan resmi belgeler. –