Vinnie’nin Mutfağından : Java Applet Versiyon Tanıma
applet, java September 27th, 2007
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
September 28th, 2007 at 7:45
çok değerli bilgilervar bu makalede eline sağlık