SORU
24 Mayıs 2011, Salı


Java, Sınıf, => Classloading; aynı kavanoz Birden çok sürümünü proje/

Bu deneyimli kodlayıcılar için saçma bir soru olacak biliyorum. Ama kavanoz benim projede kullanılan/diğer çerçeveler biraz gerektiren bir kütüphane (http istemci) var. Ama hepsi gibi farklı ana sürüm gerektirir:

httpclient-v1.jar => Required by cralwer.jar
httpclient-v2.jar => Required by restapi.jar
httpclient-v3.jar => required by foobar.jar

Bu classloader bir şekilde onları ayırmak için yeterince akıllı mı? Büyük ihtimalle değil mi? Nasıl Classloader Sınıfı üç kavanoz içinde aynıdır diye bu işi yapar. Hangisi yüklü ve neden?

Bu Classloader sadece pikap tam olarak bir kavanoz veya sınıflar keyfi karışımı mı geliyor? Eğer bir sınıftan yüklü ise, örneğin version-1.jar diğer tüm sınıflar aynı classloader yüklü aynı kavanoza gidecek?

Bu sorunu nasıl başa çıkarsınız?

Orada bir şekilde "" içine kavanoz "required.jar" bir ünite/paket "Classloader veya bir şekilde bağlantılı mı? tarafından olarak görülmektedir" birleştirmek için numara

CEVAP
24 Mayıs 2011, Salı


Classloader ilgili sorunlar oldukça karmaşık bir konu. Her durumda akla bazı gerçekleri tutmak gerekir:

  • Bir uygulamada Classloaders genellikle daha tek bir tane. Bootstrap sınıf uygun delegeler loader. Yeni bir sınıf örneğini daha spesifik classloader çağrılır. Eğer yüklemeye çalıştığınız sınıf için bir referans bulmak değil, bootstrap sınıf yükleyicisi kadar için üst ve delegeler. Eğer bunların hiçbiri sınıf için bir referans bulmamız ClassNotFoundException olsun yüklemeye çalışıyorsunuz.

  • Eğer iki sınıf ile aynı adı ikili, aranabilir tarafından aynı classloader, ve biliyor musun hangisi sensin yükleme, Tek İnceleme yolu belirli classloader çalışır çözmek için bir sınıf adı.

  • Java dilinin özelliklerine göre, sınıf ikili adı için benzersiz kısıtlama yok, ama görebildiğim kadarıyla, her classloader için benzersiz olmalıdır.

Aynı ikili ile iki sınıf adı yüklemek için bir yol bulabilirim, ve onlara yüklenen (ve tüm bağımlılıklarını) iki farklı classloaders varsayılan davranışı geçersiz kılarak olmasını gerektirir. Kaba bir örnek:

    ClassLoader loaderA = new MyClassLoader(libPathOne);
    ClassLoader loaderB = new MyClassLoader(libPathTwo);
    Object1 obj1 = loaderA.loadClass("first.class.binary.name", true)
    Object2 obj2 = loaderB.loadClass("second.class.binary.name", true);

Ben her zaman classloader özelleştirme zor bir görev buldu. Daha doğrusu birden fazla önlemek için öneririm mümkünse uyumsuz bağımlılıkları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Developers

    Google Devel

    23 AĞUSTOS 2007
  • gsipek

    gsipek

    20 Temmuz 2007
  • pucksz

    pucksz

    24 Mart 2006