Vinnie’nin Mutfağından : Java Applet Versiyon Tanıma

applet, java September 27th, 2007

Vinnie Merhaba,

Java appletleri her ne kadar her ortamda çalışmak üzere tasarlanmış olsa da hızlı gelişimi ve kütüphanesinin gittikçe genişlemesi yazdığımız appletlerin bir minimum sanal makina (VM) versiyon gereksinimini ortaya çıkarabilir. İnternet ortamında hala Microsoft VM kullananların da bulunduğunu düşünürsek yaptığımız sitenin girişinde gerekli versiyonu indirmek üzere javascript ile kullanıcıyı yönlendirebiliriz.

İlk iş olarak sanal makinanın üreticisini belirlemekle işe başlıyoruz.

public String ureticiBul(){
  String uretici = System.getProperty("java.vendor");
  if (uretici.startsWith("Sun")) {
    return "Sun";
  } else if (uretici.startsWith("Microsoft")) {
    return "MS";
  } else if (uretici.startsWith("BEA")) {
    return "BEA";
  } else {
    return "?";
  }
}

Eğer üretici Sun ise “java.version” ya da “java.vm.version” özelliklerini kullanarak versiyonu öğrenebiliriz. Örneğin şu anki son java sürümü olan Java 6 update 1 için “java.version” özelliği “1.6.0_01″, “java.vm.version” ise “1.6.0_01-b06″ değerine sahip olacaktır. Bu Sun’ın oluşturduğu major.minor.mikro(_güncelleme)(-kilometretaşı)-derleme versiyon kuralıdır ve BEA de bu kurala uymaktadır.

Her zaman kendi kurallarını oluşturmayı seven MS için ise “java.vm.version” kullanılamaz, “java.version” özelliği ise okunabilir olmasına rağmen bize derleme numarası gibi detaylı bir bilgi vermez(Örnek: 1.1.4). Kendine özgü bir versiyon numarası ise bulmak mümkündür ki Windows XP Microsoft VM için (5.0.0.3805), Windows Update ile indirilen güncelleme sürümü için (5.0.0.3810)’dur. Bunlar arasındaki build increment yani derleme artırım numarası kadar olan küçük farkı ancak özel bir metod yazarak bulabiliriz.

public java.util.Properties msVMVersiyonBul() throws Exception {
  return (java.util.Properties)
    Class.forName("com.ms.util.SystemVersionManager")
      .getMethod("getVMVersion", null)
      .invoke(null, null);
}

Bu kod parçacığı aslında SystemVersionManager adlı bir sınıf içerisindeki static bir metodu çağırmakta. Yapılan iş aşağıdaki kodun aynısıdır.

public java.util.Properties getMsVMVersion() throws Exception {
  return com.ms.util.SystemVersionManager.getVMVersion();
}

Bu kısmı direk olarak yukarıdaki gibi yazsaydık sınıfın bulunduğu Microsoft’a özel kütüphane olmadığından kodumuzu derleyemeyecektik. Derlesek bile bir Sun sanal makinası içinde çalışırken önce referans edilen sınıflar yüklenmeye çalışılacağından hata ile karşılaşacaktık. Bunun için Java’nın reflection sisteminin sınıflarına (java.lang.Class, java.lang.reflect.Method gibi) başvurarak direk referans vermeden sınıfı bulup getVMVersion metodunu çağırdık, böylece kodun buraya uğramadığı durumlarda hata vermesini de önlemiş olduk.

Manyak Not: Pek hoşlanmadığımız veritabanı kodu öncesi Class.forName() çağırma zorunluluğu da aynen bu nedenle yani veritanına bağımlı olmamak içindir.

Çağrı ile dönen java.util.Properties tipindeki nesneyi inceleyecek olursak içinde şu özellikleri bulabiliriz:

Description: Versiyon açıklaması
MajorVersion: Büyük versiyon numarası
MinorVersion: Küçük versiyon numarası
BuildNumber: Derleme sayısı
BuildIncrement: Derleme artırım sayısı

Properties objesinden bu özellikleri get metodu ile String olarak aldıktan sonra kontrollerimizi yapabiliriz.

if (ureticiBul().equals("MS") &&
    msVMVersiyonBul().get("BuildIncrement").equals("3805")) {
  return "Bu applet MS'in bu versiyonu ile çalışmaz." +
         "Siz en iyisi java.sun.com'dan gerçek bir JVM indirin";
}

Son olarak eklenmesi gereken konu sınıf versiyon uyumluluğu. Kodumuzu yazdıktan sonra derleme aşamasında üretilen kod derlemede kullandığımız JDK versiyonuna göre üretilecektir. Yani Java 6 ile derlediğimiz applet Java 5′te çalışmayacaktır. Bu da Java versiyonunu tanımayı anlamsız hale getirir. Bunu aşmak için Java derleyicisine versiyon 1.1 uyumlu kod üretmesini sağlayacak target argümanını vermemiz gerek.

javac -source 1.3 -target 1.1 JVMTani.java

Oluşan sınıfı afiyetle applet olarak kullanabiliriz. Bildiğiniz gibi Sun ile MS arasındaki problem yüzünden MS artık VM üretmeyecek. Yine de internette çok sayıda MS VM olduğunu unutmayın ve kontrolünüzü ona göre yapın.

Hepinize afiyet olsun


Social Bookmarking
Add to: Mr. Wong Add to: Digg Add to: Del.icio.us Add to: Reddit Add to: StumbleUpon Add to: Slashdot Add to: Netscape Add to: Furl Add to: Yahoo Add to: Google Add to: Technorati Add to: Newsvine Add to: Ma.Gnolia



Başka Manyak Konular


Lütfen Yorumlarınızı bizimle paylaşın.

One Response to “Vinnie’nin Mutfağından : Java Applet Versiyon Tanıma”

  1. toddy Says:

    çok değerli bilgilervar bu makalede eline sağlık

Leave a Reply

Site Navigation

Categories

Archives

Meta

Recent Enteries

Recent Comments

FireStats iconPowered by FireStats