Professional Documents
Culture Documents
Another Nice Tool ANT IKESKIN WwwJavaDiliCom
Another Nice Tool ANT IKESKIN WwwJavaDiliCom
i.c
dil
Another Nice Tool
vaja
w.
12.01.2005
ww
m
İÇİNDEKİLER
o
ANT’IN KURULUMU ............................................................................................. 3
i.c
Sıkıştırılmış Klasör ve Dizinleri Açma ............................................................................. 3
dil
Basit Bir Build.xml Örneği ................................................................................................... 4
Açıklamalar............................................................................................................................ 4
KAYNAKLAR...................................................................................................... 15
ja
w.
ww
1
ANT
m
ANT’A GİRİŞ
Ant; Apache Yazılım tarafından geliştirilmiş, açık kaynak java tabanlı bir yazılım geliştirme
aracıdır. Ant kısaltmasının açılımı Another Nice Tool olarak bilinir. Tomcat, JDOM gibi açık
o
kaynak ürünlerin geliştirilmesinde kullanılmıştır.
Büyük bir projede çalıştığımızı düşünelim. Bu proje bir Java projesi olsun ve bir çok .java
uzantılı kütüklerden oluşsun. Diğer sınıflara bağlı olan sınıfların olduğunu ve bu sınıfların farklı
i.c
dizinler altında yer aldığını, çıktı kütüklerinin de farklı dizinlerde yer alacağını düşünelim.
Farklı uygulamalar için çeşitli proje geliştirme yolları olacaktır. Bunların yönetimi sırasında
kütüklerin derlenmesi, dizinlerin değiştirilmesi ile çok fazla zaman kaybı söz konusu olacaktır.
Ant, böyle bir durumda size düşen iş yükünü oldukça hafifleten bir araçtır. Ant, aslında Java
Programlama dili için geliştirilmiş bir geliştirme aracıdır; fakat bir çok farklı alanlarda da
kullanılabilir. Salt Java ile kodlanmıştır ve platform bağımsızdır. Özellikle karmaşık, defalarca
tekrarlanan işlemleri otomatikleştirmek için kullanılmaktadır. Ant, XML formatındaki
dil
belgelerde yer alan komutları kabul eder. Konfigürasyon dosyası XML formatındadır. Bu
nedenle, genişletilebilirdir.
Ant 'ın da bir takım eksikleri vardır. Uzun yıllar bu eksikler antmerge ile kapatılmaya çalışıldı.
Ant 1.6 versiyonu ile beklenilen özellikler sağlandı.
İşlevsel olarak, Unix İşletim Sistemindeki make programının platform bağımsız türevi gibi
va
düşünülebilir.
MB’dır.
• Make, çok yoğun sözdizim kurallarına dayanır. Eğer Make içinde bir TAB karakteri
unuttuysanız, birden hiç bir şey çalışmaz.
• Ant, Java’ya özgü işlemler için daha uygundur: Tüm görevler tek bir VM (virtual
w.
machine) tarafından çalıştırıldığında, Ant Make’e göre daha hızlı çalışır. Ayrıca,
javadoc yaratma, JAR/WAR kütüklerini oluşturma ve EJB’lerle çalışma gibi bazı
Java’ya özgü işlemler için de kullanımı daha kolaydır.
• Ant, Make gibi Unix’in Shell komutlarıyla değil, daha esnek bir yaklaşım olarak java
sınıflarıyla kodlanır.
ww
2
ANT
m
ANT’IN KURULUMU
Ant, açık kaynak bir araç olduğu için sıklıkla versiyonu değiştirilen bir araçtır. Kurulum
o
açıklaması, tüm versiyonlar için geçerli olması açısından, genel anlamda verilmektedir.
i.c
Gereken Kaynakları Web Sitesinden İndirme
• http://archive.apache.org/dist/ant/binaries/ adresinden istenilen bir sürümün
jakarta-ant-bin.zip ve optional.jar dizinleri indirilir.
dil
• Sıkıştırılmış dizinler, C:\Java\Ant izinde Ant dizinine açılır.
• Seçilen sürümün optional.jar kütüğü C:\Java\Ant\lib izine taşınır.
Bu kütük sadece FTP, Junit, EJB işlevleri gibi opsiyonel Ant işlevleri için kullanılır.
• %ANT_HOME%\lib altındaki tüm JAR kütükleri, Ant’ın çalıştırılmasıyla çağırılan ant.bat
ile CLASSPATH’e eklenir.
va
Çevre Değişkenlerini Güncelleme
• ANT_HOME değişkeni Ant’ın sıkıştırılmış dizininin açıldığı yeri göstermek üzere
yaratılır.
• JAVA_HOME değişkeni, yazılımın kurulduğu makinede JDK ’nın yerini gösterecek
şekilde ayarlanır.
• Xerces gibi JAXP-Uyumlu bir XML Parser’a “latest binaries” ile gösterilen sıkıştırılmış
ja
3
ANT
m
ANT’LA İLGİLİ TEMEL BİLGİLER
Ant build kütüğü XML formatındadır. Build kütüğününün üzerinde işlem yapabilmek için, basit
o
bir metin editörü yeterli olacaktır. Harici bir XML parser’a gerek yoktur. Zaten Ant’ın kurulumu
sırasında JAXP Uyumlu XML parser yüklenir.
Aşağıda basit bir Ant örneği ve Ant komutlarıyla ilgili açıklamalar görülmektedir:
i.c
Basit Bir Build.xml Örneği
<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">
<property name="src" value="."/>
<property name="build" value="build"/>
dil
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!- - Java kodunu derleme - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>
va
Açıklamalar
<?xml version="1.0"?>
ja
¾ Ant build kütüğü bir XML kütüğü olduğu için; belge XML bildirisi ile başlar. Bu bildiri
XML’in hangi versiyonun kullanıldığını gösterir. Gerektiğinde otomatik olarak
versiyonun tanınmasını sağlar.
w.
¾ Bir Ant build kütüğünün kök elemanı project ‘tir. Project’in üç niteliği vardır:
ww
4
ANT
m
<property name="src" value="."/>
<property name="build" value="build"/>
o
¾ Property elemanı; değişkenler gibi, kullanıcının tanımlayabileceği, Ant build kütüğü ile
kullanılabilen özelliklerin bildirimine izin verir. Name niteliği property’nin (özelliğin)
adını, value niteliği ise istenen property’nin değerini belirtir. Yukarıda name’e src,
i.c
value’ya “.” atanmıştır. Bu yolla tanımlı bir property’e referans göstermek için name,
${ ve } karakterleri arasına alınır. Örneğin, src’nin değerine referans göstermek için
${ src } yazılabilir. Bu örnekte src .java kütüklerinin yerini belirtmek amacıyla
kullanılmıştır.
dil
<target name="init">
<mkdir dir="${build}"/>
</target>
¾ Target (hedef) elemanı bir action serisini sarmak amacıyla kullanılmaktadır. Bir
target’ın bir name niteliği vardır. Bu nitelikle, komut satırı gibi başka bir yerden ya da
va
içeriden depends anahtar kelimesiyle referans gösterilebilir ya da doğrudan
çağırılabilir. Örnekteki target “init” tir. Bu target, mkdir komutuyla build property ile
verilmiş olan isme sahip bir dizin oluşturur.
5
m
ANT
¾ Daha önce açıklandığı gibi depends; bir target çalıştırılmadan, çalıştırılması gereken
target’ların çalışmasını sağlar. Yukarıdaki build.xml örneğinde depends, compile
çalıştırılmadan init’in çalıştırılması gerektiğini gösterir.
o
<target name="compile" depends="init">
i.c
<!- - Java kodunu derle. - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>
¾ javac komutu ile src property ve build property referans gösterilerek; hedef dizin ile
kaynak dizin belirtilir. Yukarıdaki örnek, javac komutunun çalıştırılmasını ve src ile
belirtilen dizin altında yer alan tüm .java uzantılı kütüklerin derlenmesini ve sonuç
dil
.class uzantılı kütüklerin build ile belirtilen dizin altına yerleştirilmesini sağlar.
Yukarıda yazılan kaynak kodu bir metin editörüne kopyalayıp build.xml adıyla
kaydedebilirsiniz. Bir test dizini yaratıp build.xml kütüğünü bu dizinin altına yerleştirebilirsiniz.
Birkaç .java uzantılı kütük yaratıp hepsini aynı dizinin altına yerleştirebilirsiniz. Örnek olarak
aşağıdaki kodu .java uzantısıyla, bu dizinin altına test.java adıyla yerleştirebilirsiniz.
va
public class test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Build adında bir dizin yaratılır, test.java derlenir ve .class kütüğü build dizininin altına
yerleştirilir. –v ant’ı bir sürü işlem yapmaya yönlendirir. Bu işlemlerin birçoğu normalde
kullanılmaz. Komut dizisini tekrar çalıştırırsak, verilecek örnek mesaj şudur:
w.
Ant’ın iyi özelliklerinden biri; .java girdi kütükleriyle eşleşen .class çıktı kütüklerini
derlemesidir. Ant’ın bir özelliği de bir build.xml'in bir diğerini referans gösterebilmesidir. Bunu
sağlayan etiket, <import> olarak bilinmektedir. Böylece her projenin ortak hedefleri (target)
ww
6
m
ANT
o
Bu kesim tipik bir Ant build kütüğünü sağlamak ve açıklamak için verilmektedir. Verilen örnek
kolaylıkla değiştirilip kullanılabilir.
i.c
1. src : Projenin kaynak kütükleri için.
2. build : Ant tarafından derlenecek ve üretilecek çıktı kütükleri için.
3. lib : Sınıf kütüphaneleri ve onlara bağlı kütükler için.
Bir test dizini yaratılır ve bu dizinin altına yukarıda belirtilen üç dizin yerleştirilir. Basit bir java
programı, Ant’ın kullanımını örneklemeye yetecektir. Aşağıdaki program UKLights.java
import javax.swing.*;
import java.awt.*;
public class UKLights extends JFrame {
dil
kütüğüne kopyalanır ve bu kütük, src dizininin altına yerleştirilir.
va
public UKLights() {
super("UKLights");
ImageIcon icon = new ImageIcon("uklights.jpeg");
getContentPane().add(new JLabel(icon));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(315,244));
setVisible(true);
}
ja
Burada iki yordam yazılmıştır. Bunların ilki constructor (yapıcı yordam)’dır. Super (ata) sınıfını
çağırarak JFrame’e başlık olarak "UKLights" ilk değeri atanır. ImageIcon adıyla anılan bir
simge yaratılır. Bu resim, uklights.jpg adlı bir kütükteki resimdir. Bu simge, daha sonra
JFrame’e eklenen Jlabel’a eklenir. Varsayılan kapatma işlemi ele alınır. Simgenin boyutları
belirlenir ve frame (çerçeve) görünür hale getirilir. İkinci yordam ise main (ana) programdır.
ww
7
ANT
m
Build.xml kütüğü oluşturulur.
İlk olarak bu kütüğün bir XML kütüğü olduğunu belirtmek üzere aşağıdaki satır yazılır.
Böylece herhangi bir araç, kullanılan XML versiyonu ile ilgili bilgi edinebilecektir.
o
<?xml version="1.0"?>
i.c
<project name="UKLights" default="all" basedir=".">
</project>
satırlarıyla oluşturulur. Build kütüğünün geri kalan kısmını bu eleman içerir. Üç niteliği vardır.
Burada, name niteliği olarak projenin adı verilmiştir. İkinci nitelik olan default olarak,
oluşturulması gereken, varsayılan target olan all verilmiştir. Üçüncü nitelik olan basedir ise
baz alınan dizini belirtmek için kullanılır. Burada “.” ile ifade edilmesinin nedeni, o anda baz
Bu property tanımları, build kütüğünde hangi değerlere erişilebileceğini ifade eder. Burada
property’ler aracılığıyla source (kaynak), build ve library (kütüphane) dizinlerini yaratmadan
önce, bu dizinlerin yerleri belirtilir. Bu örneğe bakılarak, bu işlemin çok anlamlı olmadığı
düşünülebilir. Ancak, söz konusu kütüklerin yerleri değiştirildiğinde, property’ler sayesinde bu
dizinlerin referanslarını birer birer değiştirme yükünden kurtulmuş oluruz.
ja
Eğer build kütüğü şu anki haliyle çalıştırılırsa, sistem aşağıda belirtilen hatayı verir:
Buildfile: build.xml
w.
BUILD FAILED
8
ANT
m
all target’ı UKLights target’ına bağlıdır ;yani UKLights, all çalıştırılmadan çağırılmalıdır.
Açıklanan description (tanım), Ant’ın projecthelp opsiyonu tarafından kullanılacaktır. UKLights
target’ını eklersek:
<target name="UKLights"
o
description="Builds the main UKLights project">
<echo>Doing UKLights</echo>
</target>
i.c
Bu target’ın birer name ve description niteliği vardır. Target description, Ant’ın projecthelp
opsiyonu tarafından, erişilebilir target’ları göstermek amacıyla kullanılır. Eğer aşağıdaki komut
çalıştırılırsa;
ant -projecthelp
Buildfile: build.xml
Eğer baz alınan dizinin (burada test dizini) altındayken, ant komutu yazılırsa; üretilecek çıktı
şöyle olur:
ja
Buildfile: build.xml
UKLights:
[echo] Doing UKLights
all:
w.
BUILD SUCCESSFUL
Total time: 1 second
Farz edelim, UKLights, all’un kendisine bağlı olması nedeniyle, all’dan önce çağırılmış olsun.
Her iki target’ın da çağırılıp çağırılmadığını öğrenmek üzere, ekrana ekolama yapılır. Target,
ww
9
ANT
m
Ant, Java tabanlı komutlar olan java ve javac ile geliştirilmiştir. Javac komutu, srcdir niteliği
ile belirtilen dizinin altında yer alan tüm kütüklerin; derlenmesini ve destdir niteliği ile
belirtilen dizinin altına yerleştirilmesini sağlar. Ant, kaynak kütükleri, .class çıktı kütüklerinden
daha kısa sürede derler. Bu durum, gereken işlevsellik elle yapılmadığı takdirde, Ant’ın diğer
işlevleri için de geçerlidir.
o
Ant, değiştirilmiş build kütüğü üzerinde çalıştırıldığında, aşağıda görülen çıktı üretilir:
i.c
Buildfile: build.xml
UKLights:
[echo] Doing UKLights
[javac] Compiling 1 source file to \blah\blah\blah\build
all:
dil
[echo] Doing all
BUILD SUCCESSFUL
Total time: 2 seconds
Javac komutuna sağlanabilecek birçok opsiyon vardır. Bunların kendilerine ait nitelikleri call
komutuna atanarak, bu opsiyonlar sağlanabilir. Erişilebilinir opsiyonlar: listfiles – derlenen
va
kütükleri listeler; failonerror – derleme hatası oluştuğunda, build’i başarısızlıkla sonlandırır ve
verbose’dur.
Bir niteliğe değer aktarabilmek için value alanına “true” yazmak gerekir. Eğer ant komutu,
build kütüğü üzerinde hiçbir değişiklik yapmadan tekrar çalıştırılırsa, ekrana gelecek olan çıktı
şöyle olur:
ja
Buildfile: build.xml
UKLights:
[echo] Doing UKLights
all:
[echo] Doing all
w.
BUILD SUCCESSFUL
Total time: 1 second
Bu durum, geçen süre içinde hiç derleme yapılmadığını gösterir. Build dizininin altına girilir ve
UKLights.class çalıştırılır. Hiçbir resime ulaşılamaz çünkü resim build dizininin altına
ww
10
ANT
m
Değiştirilen build kütüğü üzerinde ant komutu çalıştırıldığında, ekranda aşağıdaki ifade
görülür:
o
Varsayılan durum olarak Ant, eğer söz konusu kütük, hedef kütükten daha yakınsa ya da
hedef kütük yoksa, kütüğü kopyalar. Bu davranışı değiştirmek için overwrite niteliğine “true”
i.c
değerini atamak gerekir. Yeni bir kaynak kütük, programa ekleneceğinde; UKLights.java’nın
Constructor’ını şu şekilde değiştirmek gerekir:
public UKLights() {
dil
super("UKLights");
ImageIcon icon = new ImageIcon("uklights.jpeg");
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(new ExitControl());
JButton aboutButton = new JButton("About");
aboutButton.addActionListener(new AboutControl());
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel(icon));
va
getContentPane().add(aboutButton);
getContentPane().add(exitButton);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(315,294));
setVisible(true);
}
ja
Exit button ve about button eklenir, layout FlowLayout olarak tanımlanır. JFrame ’in boyutları
arttırılır. ExitControl ise exitButton ’ın event ’lerini (olaylarını) ele almak için tanımlanır.
import java.awt.event.*;
public class ExitControl implements ActionListener {
w.
button, yüklenen resimle ilgili bilgi görüntülemek için yaratılır. Bu butonla ilgili event’ler
(olaylar) AboutControl tarafından ele alınacaktır.
11
ANT
m
import java.awt.event.*;
public class AboutControl implements ActionListener {
public void actionPerformed(ActionEvent e) {
new AboutPopup();
o
}
}
i.c
yerleştirilir. AboutControl, yeni bir AboutPopup yaratır.
import javax.swing.*;
import java.awt.*;
dil
super("About");
String message = "\n";
message+="This image of Earth's city lights was created with
data ";
message+="from the Defense Meteorological Satellite Program
";
message+="(DMSP) Operational Linescan System (OLS). ";
message+="Originally designed to view clouds by moonlight, ";
message+="the OLS is also used to map the locations of
va
permanent ";
message+="lights on the Earth's surface.\n\n";
message+="The image has been modified by Ashley Mills to only
include ";
message+="the UK, the original image and further description
can be ";
message+="found at:\n\n";
message+="http://visibleearth.nasa.gov/cgi-
ja
bin/viewrecord?5826\n\n";
message+="This is also where the description was taken from.";
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(new Dimension(315,294));
JTextPane messagePane = new JTextPane();
messagePane.setBackground(Color.BLACK);
w.
messagePane.setForeground(Color.GRAY);
messagePane.setEditable(false);
messagePane.setText(message);
getContentPane().add(messagePane);
setResizable(false);
setVisible(true);
}
ww
12
ANT
m
Yukarıdaki kütük, AboutPopup.java adıyla src dizininin altına kopyalanır. Bu kütükte, bir
mesaj tanımlıdır. Varsayılan kapatma işlemi ele alınır. JFrame’in boyutları verilir. JTextPane
yaratılır ve bu panelin renkleri verilir vs. Böylece kütük çalıştırıldığında bir arayüz oluşturulur.
o
<target name="UKLights" depends="AboutControl,ExitControl"
description="Builds the main UKLights project">
<echo>Doing UKLights</echo>
i.c
<copy file="${src}/UKLights.jpeg" tofile="${build}/UKLights.jpeg"/>
<javac srcdir="${src}" destdir="${build}" includes="UKLights.java"/>
</target>
UKLights target artık AboutControl ve Exit Control target’larına bağlıdır. Javac komutu sadece
UKLights.java kütüğünün bu target tarafından derlenebilmesi için değiştirilmiştir. Bir kütük
listesini kabul edebilen includes niteliği, UKLights.java kütüğünün derlenmesi için kullanılır.
dil
includes niteliğinin atılmasıyla, sadece javac komutu kullanılarak tüm sınıfların derlenmesi
sağlanabilir. AboutControl target eklenir.
</target>
<echo>Doing ExitControl</echo>
<javac srcdir="${src}" destdir="${build}"
includes="ExitControl.java"/>
</target>
Bu, ExitControl.java kütüğünü derler. Diğer bir eklenmesi gereken target ise, Clean‘dir. Bu
target’ın amacı build dizininin içeriğini silmektir. Clean target eklenir:
ww
13
ANT
m
Build dizininin içeriğinin silinmesi, dir niteliğiyle fileset tanımlanması ve dizinin dir’e değer
olarak verilmesi ile gerçekleşir. Dizinin kendisinin de silinmesi için includeEmptyDirs niteliğine
true değeri verilir. delete’in verbose niteliğine “true” değeri verilerek, Ant’ın silinen kütükleri
listelemesi sağlanır. Tamamlanan build.xml ve UKLights.java kütükleri saklanır.
o
Artık, proje sonlanmıştır, test aşamasına geçilebilir. Eski build kütüğünü kaldırmak için Clean
target çalıştırılır:
i.c
ant Clean
Buildfile: build.xml
Clean:
dil
[delete] Deleting 2 files from \blah\blah\build
[delete] Deleting \blah\blah\blah\build\UKLights.class[delete]
Deleting \blah\blah\blah\build\uklights.jpeg
BUILD SUCCESSFUL
Total time: 1 second
va
Varsayılan target olan all target’ının çalıştırılabilmesi için hiçbir argüman verilmeden komut
satırına, baz alınan dizinin altında ant yazılarak aşağıda görülen çıktı elde edilir:
ja
Buildfile: build.xml
AboutPopup:
[echo] Doing AboutPopup
[javac] Compiling 1 source file to \blah\blah\blah\build
AboutControl:
w.
UKLights:
[echo] Doing UKLights
ww
BUILD SUCCESSFUL
Total time: 4 seconds
14
ANT
m
Dikkat edilirse; AboutPopup, AboutControl, ExitControl, UKLights ve all target’ları sırayla
çalıştırılmıştır. Bunun nedeni bağlı olunan target’ın önce çalıştırılmasının gerekmesidir. Sonuç
olarak, proje başarıyla sonlanmıştır.
o
KISALTMALAR
i.c
EJB Enterprise Java Bean
FTP File Transfert Protocol
JAR Java Archive
JAXP Java API For XML Processing
JDK Java Development Kit
JDOM Java Document Object Model
JUNIT Java Unit
VM
WAR
XML
KAYNAKLAR
Virtual Machine
Web Archive
dil
Extensible MarkUp Language
va
• http://jakarta.apache.org/ant/resources.html
Apache Ant Resource Homepage
• http://jakarta.apache.org/ant/manual/index.html
Apache Ant 1.5 Manual
• http://www.iseran.com/Java/ant/tutorial/ant_tutorial.html
ja
• http://www.google.com
w.
ww
15