classpath etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
classpath etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Ağustos 2011 Perşembe

Arşiv Dosyaları

Java'nın kısa sürede yaygınlaşmasındaki önemli etkenlerden biri—belki de en önemlisi—Bytecode komutları içeren standardize edilmiş sınıf dosyalarının sanal makine üzerinde çalışmasıyla sağlanan makine kodu düzeyindeki taşınabilirlik özelliğidir. Java'nın doğum yeri olan Sun şirketi tarafından "Bir kez yaz, her yerde çalıştır" (İng., write once, run anywhere (WORA), write once, run everywhere (WORE)) sloganıyla tanıtılan bu özellik sayesinde, Java programlarının derlendikten sonra JSM bulunduran herhangi bir platformda çalıştırılması mümkün olmaktadır. Bunun için, gerekli sınıf dosyalarının konulduğu bir siteden indirilmek veya CD içinde verilmek suretiyle kullanıcıya sağlanması yeterli olacaktır.

  1. [Geliştirici] Geliştirilen programı derleyerek sınıf dosyası haline çevir.
  2. Sınıf dosyalarını kullanıcıya sağla.
  3. [Kullanıcı] Programı çalıştır.

Yazılımın büyümesiyle birlikte yukarıdaki 2 nolu adıma konu olan dosyaların sayısı artacak ve bu da dağıtım işini zorlaştıracaktır. Ayrıca, gereksinilen disk alanı ve indirme zamanı da olumsuz etkilenecektir. Örnek olarak, 90'ların ortalarında Microsoft'un Wintel bağımlısı çözümlerine karşı alternatif olarak ortaya çıktığında büyük heyecan yaratan uygulamacıkların (İng., applet) örün tarayıcıları tarafından çalıştırılmasına göz atalım. Kendisine bağlantı veren sayfalara dinamik içerik sağlayan ve etkisini kullanıcı tarafında çalıştırılarak gösteren uygulamacıklar işlerini şöyle görür.

  1. Kullanıcı uygulamacık bağlantısı barındıran bir sayfaya tıklar.
  2. Sayfa ile birlikte uygulamacığı oluşturan sınıf dosyaları ve diğer kaynaklar (görüntü, ses, vb.) indirilir.
  3. Uygulamacık, tarayıcıdaki JSM tarafından çalıştırılır.

Yukarıda kabaca anlatılan sürecin hızı, uygulamacığın gerçekleştiriminde seçilen algoritma ve veri yapıları seçimlerine ek olarak, 2. adımda indirilen dosyaların sayısı ve büyüklüğüne göre değişecektir. Dosyaların artması ve büyümesi performansı ve kullanıcı deneyimini olumsuz yönde etkileyecektir. İşte bundan dolayı—daha genel bir ifadeyle, yazılım dağıtımını daha etkin hale getirmek için—Java platformu tasarımcıları arşiv dosyalarını sağlamışlardır. Buna göre, geliştiricilerden beklenen, birlikte indirilecek/kurulacak dosya ve kaynakları sıkıştırarak bohçalayan arşiv dosyalarının kullanımıdır.

Arşiv Manipülasyonu


Arşiv dosyaları Yazılım Geliştirme Kutusu'nun parçası olan jar adlı arşivci komutu yardımı ile oluşturulabilir. Bu komut, ZIP-temelli formata sahip bir arşiv oluşturmanın yanısıra, verilen bir arşivin güncellenmesi, içeriğinin listelenmesi ve açılması için de kullanılabilir. Hangi işlemin kastedildiği komut adını takiben verilen ve aşağıdaki değerleri alabilen bir opsiyon ile belirtilir. Listelenenlere ek olarak, f opsiyonunun işlemin hedefi olan arşiv dosyasının adı için kullanıldığı bilinmelidir. Ayrıca, işlemin neler yaptığını daha ayrıntılı bir biçimde standart çıktıya basan v opsiyonu da kimi zaman yardımcı olabilir. Son olarak, girdi sağlanmasını gerektiren birden çok opsiyonun kullanılması durumunda, arşivcinin opsiyon sırası ile girdi sırasının aynı olduğunu varsaydığı unutulmamalıdır.1

Arşiv dosyası işlemleri
OpsiyonAnlamı
cOluşturma
uGüncelleme
tİçerik listeleme
xAçma

Buna göre, aşağıdaki komut o anki çalışma dizininin içindeki a.class ve b.class dosyalarının yanısıra images dizininin içindeki dosyalardan oluşan ArşivDosyası.jar adlı bir arşiv yaratacaktır.2 Dizin içindeki dosyaların ele alınması sırasında, altdizinlerin özyinelemeli bir biçimde işlendiği unutulmamalıdır. Yani, komutumuz images içindeki tüm dosyaları, altdizinler içindekiler de dahil olmak üzere, arşive katacaktır. Arşive nelerin girdiğini görmek isterseniz, v opsiyonu işinizi görecektir.
$ # Arşiv oluşturma
$ jar cf ArşivDosyası.jar a.class b.class images
İşlemin daha az zahmetli olmasını sağlamak için, dosya adı sağlama sırasında joker karakterinden yararlanılabilir. Örneğin, çalışma dizini içindeki sınıf dosyalarının a.class ve b.class'a sınırlı olması durumunda aşağıdaki komut yukarıdaki ile aynı işlevi görecektir.
$ jar cf ArşivDosyası.jar *.class images
Arşivin oluşturulması sırasında, girdi dosyalarının dizin yapısı korunur. Örneğin, yukarıdaki komutların icra edilmesi sonrasında a.class ve b.class arşivin kök dizininde yer alırken, görüntü dosyaları images altdizini içine konulmuş olacaktır. Bu davranışın değiştirilerek görüntü dosyalarının da sınıf dosyaları ile aynı dizine konulması istenecek olursa, -C opsiyonunun kullanılması gerekecektir. Bu opsiyon, geçici olarak kendisinden sonra sağlanan altdizine geçer ve dosya adını arşivleme sanki geçici altdizinde yapılıyormuş gibi arşive ekler. Buna göre, aşağıdaki komut o anki çalışma dizininde bulunan sınıf dosyaları ile images altdizinindeki tüm dosyaları arşivin kök dizinine yerleştirir.
$ jar cf ArşivDosyası.jar *.class -C images *
Kimi zaman, sıfırdan oluşturmak yerine ufak bir ekleme veya değişiklik yaparak var olan bir arşivi güncellemek isteyebiliriz. Oluşturmaya göre daha ucuz olan bu işlem u opsiyonu ile gerçekleştirilebilir. Arşiv oluşturma ile aynı argümanlara sahip bu işlem, kendisine geçirilen dosyanın arşivde var olması durumunda yeni dosyayı arşivdekinin üzerine yazar. Buna göre, aşağıdaki örnek kullanım ArşivDosyası.jar dosyasına c.class dosyasını eklerken, arşivde hali hazırda var olan a.class dosyasını yeni haliyle güncelleyecektir.
$ # Arşiv güncelleme
$ jar uf ArşivDosyası.jar a.class c.class
Daha önceden oluşturulmuş bir arşivin içeriği t opsiyonu ile listelenebilir. Standart çıktıya basılan listede arşivdeki dosya ve altdizinlerin kök dizine göre adları yer alır. Altdizinlerin / ile sonlandırıldığı bu listelemenin daha ayrıntılı yapılabilmesi için v opsiyonu kullanılabilir.
$ #Arşiv içeriği listeleme
$ jar tf bsh-2.0b4.jar
META-INF/
META-INF/MANIFEST.MF
bsh/
bsh/BSHAllocationExpressin.class
bsh/BSHAmbiguousName.class
...
Bir arşivin açılması arşivciye x opsiyonunun sağlanmasıyla mümkün olur. Arşiv içindeki dosya sıradüzenini disk üzerinde aynen oluşturan bu işlemin hali hazırda var olan dosyaların üzerine yazacağı unutulmamalıdır.
$ # Arşiv açma
$ jar xf bsh-2.0b4.jar

Arşiv Manifestosu


İçerik listeleme örneği farklı arşivler için denenecek olursa, META-INF dizini içindeki MANIFEST.MF dosyasının her zaman çıktıda yer aldığı görülecektir. Sakın, bunun arşiv yaratıcılarının sizi paranoyaya sürüklemek amacıyla sözleşerek uyguladığı bir komplo olduğunu düşünmeyin; nasıl ki, gemiler taşıdıkları kargonun ayrıntısını içeren bir manifesto bulundururlar, arşiv dosyaları da söz konusu arşivin sahip olduğu özellikleri belirtmek amacıyla META_INF/MANIFEST.mf dosyası içinde bir manifesto bulundurur.

Aksine bir yönlendirmede bulunmadığınız takdirde, arşiv oluşturma sırasında sizin için minimal içerikli bir manifesto oluşturulur.3 Manifest-Version: 1.0 satırından oluşan bu manifestoyu arşiv oluşturma veya güncelleme sırasında sağlanacak m opsiyonu ile isteğinize göre değiştirebilirsiniz. Yapılacak değişikliklerin üzerine yazma yerine kaynaştırarak işini gördüğü akıldan çıkarılmamalıdır. Ne demek istediğimizi bir örnekle görelim. Varsayalım ki, ArşivDosyası.jar işini görebilmek için YardımcıArşiv1.jar ve YardımcıArşiv2.jar arşivlerine ihtiyaç duyuyor. Bu durum, anılan bağımlılık bilgisini içeren bir dışsal manifesto dosyasının MANIFEST.MF'ye yamanması ile karşılanabilir.

EkManifesto.mf
Class-Path: YardımcıArşiv1.jar YardımcıArşiv2.jar
jar umf EkManifesto.mf ArşivDosyası.jar

EkManifesto.mf dosyasının MANIFEST.MF'ye yamandığı yukarıdaki satırın işlenmesi sonrasında MANIFEST.MF dosyası şu içeriğe sahip olacaktır.

MANIFEST.MF
Manifest-Version: 1.0
Class-Path: YardımcıArşiv1.jar YardımcıArşiv2.jar

İndeksleme


Dosya ve altdizin sayısının artmasıyla birlikte arşivdeki bir dosyanın bulunup kullanılması daha uzun bir zaman alacaktır. Böyle bir durumda, i opsiyonunun var olan bir arşiv ile birlikte arşivciye geçirilmesi aramayı hızlandıran bir indeks dosyası yaratarak maliyeti azaltabilir.
$ # Arşiv indeksleme
$ jar i ArşivDosyası.jar
META-INF altdizini içindeki INDEX.LIST dosyasına yazılan indeksleme bilgisinin, arşivin her güncellenmesi sonrasında yeniden yaratılması gerektiği unutulmamalıdır. Ayrıca, indekslemenin diğer işlemlerden ayrı yapılmasının zorunlu olduğu da akıldan çıkarılmamalıdır.

Arşiv Kullanımı


Edindiğiniz arşiv dosyalarından değişik şekillerde yararlanabilirsiniz. Öncelikle, arşiv dosyaları sınıf yolu üzerindeki bir dizine açılmak suretiyle kullanılır hale getirilebilir. Daha zahmetsiz bir diğer yöntem, arşiv dosyasını CLASSPATH ortam değişkenine eklemekten geçer. Örnek olarak, ArşivDosyası.jar'ı kullanan Prog.java adındaki bir dosyanın nasıl derleneceğine bakalım.
javac -cp ".:/home/tevfik/Java Paketleri/ArşivDosyası.jar:$CLASSPATH" Prog.java
Yukarıdaki komuta göre, Prog.java dosyasında ihtiyaç duyulan sınıf dosyaları öncelikle o anki çalışma dizininde, sonra /home/tevfik/Java Paketleri dizininde bulunan ArşivDosyası.jar arşivinde ve nihayet CLASSPATH ortam değişkenince işaret edilen yerlerde aranacaktır. Bu noktada, CLASSPATH ortam değişkeninin içerdiği arşiv dosyası atıflarının mutlak konum verilerek yapılması gerekirken, komut satırında yapılacak uygulamaya özel eklemelerin göreceli olarak da verilebileceği akılda tutulmalıdır.

Arşiv dosyaları, edimli kütüklere benzer şekilde bir komut gibi de kullanılabilir. Bunun için, öncelikle arşiv manifestosuna giriş noktasını içeren çalıştırılabilir sınıfın hangisi olduğunu gösteren Main-Class anahtarı ve ilişkin değerin eklenmesi gerekir. Yukarıda gösterdiğimiz şekilde manifestoya yapılacak bir değişiklikle sağlanabilecek bu bilgi, arşivciye e opsiyonu ile de bildirilebilir.
$ # Arşiv giriş noktası
$ jar cfe ArşivDosyası.jar AnaSınıf.class
Yukarıdaki komutun işlenmesi sonrasında, arşivci tarafından oluşturulacak minimal manifesto Main-Class: AnaSınıf.class satırını da içerecektir.

Giriş noktası bilgisine sahip bir arşivin çalıştırılması oldukça basittir; yapılması gereken, JSM'ye -jar opsiyonunun geçirilmesinden ibarettir. Böylesine bir kullanım, JSM'ye argümanda sağlanan dosyanın bir arşiv olduğu ve çalışmanın çalıştırılabilir sınıf adının manifestodaki Main-Class'a dair değerden öğrenilip bulunması sonrasında başlayacağı anlamına gelir.
$ # Arşiv çalıştırma
$ java -jar ArşivDosyası.jar


  1. Pek fazla kullanılmasa da, arşivciye sağlanan 0 opsiyonu arşivin sıkıştırma yapılmaksızın oluşturulacağı anlamına gelir.
  2. Unix temelli işletim dizgelerinden alışmış olanlara uyarı: opsiyon öncesinde - yok.
  3. İstenecek olursa, M opsiyonu ile minimal manifestonun oluşturulmasının önüne geçilebilir.

14 Temmuz 2011 Perşembe

Paketler ve Sınıf Yolu

Okumakta olduğu üniversitenin kütüphanesinde kitap arayan hevesli bir öğrenciyi düşünün. Bu öğrenci, belli bir düzene göre düzenlenmiş kütüphaneyi bu düzene uygun biçimde dolaşarak arayışını kolaylaştırabilir. Örneğin, kitapların fakülte, dal ve konu sıradüzenine (hiyerarşi) göre gruplanması durumunda, programlama dersine dair bir kitabı arayan öğrenci, arayışını önce mühendislik kitaplarına, sonra mühendislik kitapları içindeki bilgisayar mühendisliği kitaplarına ve nihayet bilgisayar mühendisliği kitapları içindeki programlama kitaplarına kısıtlayacaktır. Son adımda ise, konuya dair kitaplar içinde yapılan aramayı takiben, istenen kitap ya bulunacak ya da bulunamayacaktır. Kütüphanedeki kitap sayısı düşünüldüğünde, bu yöntemin kütüphanedeki tüm kitapları baştan sona sırasal bir biçimde tarayarak aramaktan çok daha verimli olacağı kesindir.

Java platformundaki türler de (sınıf ve arayüzler) kütüphanedeki kitapları andıran bir sıradüzenine konulur. Aynı konudaki kitapların kütüphanede aynı bölgeye yerleştirilmesinde olduğu gibi, ilişkili türler aynı paket içine konulur. Gerektiği takdirde, birbirine yakın kavramların gruplandığı paketler bir üstpaket içine yerleştirilebilir. Paket içine paketlerin ve/veya türlerin konulması ile oluşturulan bu sıradüzeninin amacı, platformdaki türlerin algılanmasını ve ilişkin sınıf dosyalarının ihtiyaç duyan paydaşlarca bulunmasını kolaylaştırmaktır.

Paket oluşturmanın bir diğer sebebi, farklı kişiler tarafından hazırlanmış türlerin ad çakışması olmadan kullanılmasını olanaklı kılmaktır. Ne kastettiğimizi, bir sergideki tabloların envanterini tutmak için yazılmış olan (Prog.java dosyasındaki) Java programının resmedildiği aşağıdaki şekil üzerinden görelim.1


abc şirketi tarafından hazırlanan ve nesne kabı olarak hizmet veren Tablo sınıfı ile, def şirketince gerçekleştirilen ve sanat eseri olan tablo kavramını soyutlayan aynı adlı sınıftan yararlanılan Prog.java içindeki tür tanımlarının başarılı bir biçimde derlenebilmesi için aynı ada sahip her iki sınıfın birbirinden ayırt edilmesini mümkün kılacak bilginin sağlanması veya sınıf adlarından birisinin ya da her ikisinin de değiştirilmesi gerekir. Kaynak kodun elimizde olmayabileceğini düşünürsek, ad değiştirmenin çoğu zaman pek de uygulanabilir bir seçenek olmadığı görülecektir. Yapılması gereken, her iki şirketin de olası kullanım senaryolarını göz önünde bulundurarak tür tanımlarını diğer şirketlerinki ile çakışma ihtimali olmayan bir paketin içine koymasıdır. Bu bağlamda önerilen yöntem, şirketin İnternet üzerindeki varlığını temsil eden ve diğer şirketlerinki ile çakışması olanaksız olan alan adının kullanılmasıdır. Ek olarak, şirket içindeki yazılım envanterini tutmayı kolaylaştırmak adına, bazı ek bilgiler kullanılabilir. Buna göre, abc şirketinin ürettiği Tablo.java dosyasındaki Tablo sınıfının aşağıdaki gibi yazıldığı düşünülebilir: Türkiye'deki bir ticari şirket olan abc'nin yazılım mimarlarınca belirlenen kurallara bağlı olarak, Tablo sınıfı bakımını kolaylaştırmak adına diğer veri yapıları ile birlikte bulunabileceği vy paketine koyulmakta.

Tablo.java
package tr.com.abc.vy;

...

public class Tablo {
  ...
} // Tablo sınıfının sonu

Bu noktada, hemen ilk uyarımızı yapalım: dosya içinde tanımlanan türlerin ait olduğu paketi ilan eden package bildirimi, kaynak kodun yorum satırları dışındaki ilk öğesi olmalıdır. Ayrıca, aynı dosyada sadece bir paket bildirimi bulunabilir.

Yapılan tanımların paketlere yerleştirilmesi, söz konusu türlerin kullanımı aşamasında bazı şeylere dikkat edilmesini gerektirir. Öncelikle, atıfta bulunurken artık türün yerleştirildiği paket de hesaba katılmalıdır; türün adı kaynak dosyada sağlanan ilişkin tanımdaki ile aynı değildir. Örneğin, tr.com.abc.vy paketindeki Tablo sınıfı, tr.com.abc.vy.Tablo adına sahiptir, Tablo değil. Dolayısıyla, bu sınıfın nesnesi aşağıdaki gibi yaratılmalıdır.

...

tr.com.abc.vy.Tablo tablo =
  new tr.com.abc.vy.Tablo(...);

Yukarıdaki gibi uzun adların kullanılmasının doğuracağı olası yazım hataları iki şekilde azaltılabilir. Öncelikle, programlama dilinden bağımsız bir şekilde kullanılan geliştirme ortamlarındaki ad tamamlama özelliğinden yararlanılabilir. Java programcısı olarak bizi ilgilendiren ikinci seçenek ise, package bildiriminin kullanıcı tarafındaki tamamlayıcısı olarak görülebilecek import bildirimidir. Buna göre, Tablo sınıfı aşağıdaki gibi de kullanılabilir.

...
import tr.com.abc.vy.Tablo;
...
Tablo tablo = new Tablo(...);

import bildirim(ler)inin package bildiriminin ardından gelmesi gerektiği unutulmamalıdır. Ayrıca, java.lang paketinin içindeki türlerin özel bir şekilde ele alındığı ve Java derleyicisi tarafından otomatikman program içine getirildiği hatırda tutulmalıdır.

Program içinde yararlanılan tür sayısının artmasıyla birlikte import bildiriminin jokerli uyarlamasının kullanımı düşünülebilir. Bu bildirim, söz konusu paket içindeki tüm türlere kısa adlarıyla atıfta bulunmayı olanaklı kılar.

...
import tr.com.abc.vy.*;
...
Tablo tablo = new Tablo(...);

Bu noktada bir uyarının daha yapılması yerinde olacaktır: bir paketin jokerli import bildirimi ile görünür kılınması, paketin "içindeki" diğer paketlerin görünürlüğünü etkilemez; tüm paketlerin ayrı ayrı görünür kılınması gerekir. Çünkü, paketler sadece türler için aduzayı görevi görürler, diğer paketler için değil. Mesela, java.util paketinin görünür kılınması java.util.regex paketinin içindeki sınıfları görünür hale getirmeyecektir.

Değinilmesi gereken bir diğer bildirim, J2SE 5 ile birlikte Java'ya eklenen static import bildirimidir. Bu bildirim, bir sınıfın—paketin değil!—static bir öğesinin (veya tüm static öğelerinin) sınıf adı ile nitelenmeksizin kullanılabilmesini sağlar. Buna göre, aşağıdaki kodda java.lang.System sınıfının tüm static öğeleri sınıf adıyla nitelenmeksizin kullanılabilirken, java.lang.Math sınıfının yalnızca PI adlı özelliği benzer biçimde kullanılabilecektir.

...
import static java.lang.Math.PI;
import static java.lang.System.*;
...
double alan = PI * Math.pow(yarıçap, 2);
out.println("Alan: " + alan);

Gerçekleştirimci tür tanımını package bildirimi ile bir pakete koyar, kullanıcı söz konusu türü kısa adı ile kullanmak isteyecek olursa import bildiriminden yararlanır demekle işimizin bittiğini zannediyorsanız, üzülerek yanıldığınızı söylemeyelim. Kullanıcı, program içinde yararlanılan türlere ait gerçekleştirimleri içeren sınıf dosyalarının nerede aranması gerektiğine dair bilgiyi derleyiciye sağlamalıdır. Kütüphanede bıraktığımız hevesli öğrenciye dönecek olursak, öğrencimizin bir şekilde kütüphanenin bulunduğu yeri bilmesi gerekir. Aslına bakılırsa, öğrencimizin biraz daha azimli davranıp, aranan kitabın bulunmaması halinde aramaya devam edeceği diğer kütüphanelerin adresini öğrenmesinde yarar olacaktır. Buna göre, kitap arama aşağıdaki adımlar izlenerek yapılır diyebiliriz.

  1. Adres listesinden bir sonraki kütüphanenin adresini bul. Böyle bir adresin olmaması durumunda, boynunu bükerek evine dön.
  2. Adreste belirtilen kütüphanede aramaya başla.
  3. Aramanın başarıyla sona ermesi durumunda kitabı çantaya koy. Aksi takdirde, 1. adıma git.
  4. Kitabın gerekli bölümlerini oku.

Algoritmamızı Java derleyicisinin2 sınıf dosyası arama algoritmasına uyarlayacak olursak...

  1. Sınıf yolu listesinden bir sonraki sınıf yolu dizininin konumunu bul. Böyle bir konumun olmaması durumunda, kullanılmak istenen türe dair tanımın bulunmadığını ilan et ve derlemeyi başarısızlıkla bitir.
  2. Sınıf dosyasını sınıf yolu dizininden başlayarak ara. Bunun için, türün uzun adındaki '.' karakterlerini yol ayırıcı karakteri—Unix temelli sistemlerde '/', MS Windows temelli sistemlerde '\'—ile değiştir. Buna göre, tr.com.abc.vy.Tablo sınıfı sınıf yolu dizininin içindeki tr/com/abc/vy altdizininde aranacaktır.
  3. Aramanın başarıyla sona ermesi durumunda sınıf dosyasını belleğe yükle.. Aksi takdirde—yani, Tablo.class dosyasının bulunmaması durumunda— 1. adıma git.
  4. Türün kullanımı noktasında, kullanımın doğruluğunun denetimi için belleğe yüklenen dosyadaki bilgilere başvur.

Benzetmeyi tamamlamak için yapmamız gereken, sınıf yolu listesini Java derleyicisine aktarmak. Bu, sınıf dosyalarının aranmaya başlanacağı dizinlerin konumlarını tutan CLASSPATH ortam değişkenine PATH ortam değişkenine benzer bir şekilde değer sağlanması yoluyla olur. Bir diğer yöntem, Java derleyicisine -cp opsiyonu ile uygulama bazında bu bilginin verilmesini içerir. Aşağıda her iki yöntemin birlikte kullanımına dair bir örnek verilmektedir.3

javac -cp ".:/Java Paketleri/sergi:$CLASSPATH" Prog.java

Prog.java dosyasındaki Java programlama dili tanım(lar)ını derleyen bu komut, kullanım doğruluğunu denetlemek için ihtiyaç duyulan türlerin karşılığındaki sınıf dosyalarını önce derlenmekte olan kaynak dosya ile aynı dizinde, sonra /Java Paketleri/sergi ve nihayetinde CLASSPATH ortam değişkeni ile belirtilen dizinler içinde arayacaktır. Arama sırasında sınıf dosyasından daha sonra güncellenmiş aynı adlı bir .java dosyasına rastlanması durumunda, arama başarıyla bitmiş kabul edilecek, derleyici kaynak dosyayı derleyerek denetimlerinde bu derlenmiş dosyadan yararlanacaktır.

Son olarak, bu günceyi daha önce ziyaret edip de kod örneklerine göz atmış olanlardan bazılarınızın, package bildirimi olmaksızın yazılan türlere ne olduğunu sorduklarını duyar gibiyim. Bu haklı sorunun yanıtını vererek yazımızı bitirelim: söz konusu türler, varsayılan paket dediğimiz ve kaynak kodun bulunduğu dizinle ilişkilendirilen paketin içinde konuluyordu.



  1. Şekli bir yerden hatırladıklarını düşünenler belleklerinin oynadığı bir oyuna kurban edilmiyorlar; benzer bir şekil, Java adıyla birlikte anılan kavram ve kısaltmalara değindiğimiz yazıda🔎 da vardı. Dolayısıyla, bu yazıda değindiğimiz kavramların diğer JSM dillerinden yararlanılarak üretilmiş sınıf dosyaları için de geçerli olduğu unutulmamalı.
  2. Sınıf dosyası arama Java derleyicisine sınırlı bir işlem değil. Sınıf dosyaları ile işi olan tüm sistem yazılımlarının bu algoritmayı kullanması söz konusu olacaktır ki, buna en güzel örnek sınıf dosyalarını işleten JSM'dir.
  3. MS Windows temelli işletim dizgelerinde çalışanların ':' yerine ';', $CLASSPATH yerine %CLASSPATH% kullanmaları gerekecektir.