3. Belgedeki araçlar
Belgedeki örnekler aşağıdaki araçlarla test edilmiştir:
- NetBeans sürüm 6.8 ile 7.1.2 arası. NetBeans'in kurulumu, [ref3] belgesinin 1.3.1. paragrafında açıklanmaktadır.
- Wampserver sürüm 2.2. WampServer'in kurulumu, [ref3] belgesinin 1.3.3. paragrafında açıklanmaktadır;
- Maven, NetBeans'e entegre edilmiştir. Şimdi bu aracı açıklayacağız.
3.1. Maven
3.1.1. Giriş
Maven, URL [http://maven.apache.org/index.html ] adresinde mevcuttur. Yaratıcılarına göre:
Maven'in temel amacı, bir geliştiricinin bir geliştirme çalışmasının tüm durumunu en kısa sürede kavrayabilmesini sağlamaktır. Bu amaca ulaşmak için Maven'in ele almaya çalıştığı birkaç konu başlığı vardır:
- Derleme sürecini kolaylaştırmak
- Tek tip bir derleme sistemi sağlamak
- Kaliteli proje bilgileri sağlamak
- En iyi uygulama geliştirme kılavuzları sunmak
- Yeni özelliklere şeffaf bir şekilde geçişi sağlamak
Maven, NetBeans’e entegre edilmiştir ve biz onu tek bir özelliği için kullanacağız: bir projenin kütüphanelerinin yönetimi. Bu kütüphaneler, projenin Classpath dizininde bulunması gereken tüm jars arşivlerinden oluşur. Bunların sayısı oldukça fazla olabilir. Örneğin, gelecekteki projelerimizde Hibernate (Nesne-İlişkisel Eşleştirici) adlı ORM'i kullanacağız. Bu ORM, onlarca jar arşivinden oluşmaktadır. Maven'in avantajı, bizi tüm bunları bilmek zorunda bırakmamasıdır. Projemizde Hibernate'e ihtiyacımız olduğunu belirtmemiz ve bu ORM'in ana arşivini bulmak için gerekli tüm bilgileri vermemiz yeterlidir. Maven daha sonra Hibernate için gerekli tüm kütüphaneleri de indirir. Buna Hibernate bağımlılıkları denir. Hibernate için gerekli bir kütüphane, kendisi de başka arşivlere bağımlı olabilir. Bunlar da indirilecektir. Tüm bu kütüphaneler, Maven'ın yerel deposu adı verilen bir klasöre yerleştirilir.
Bir Maven projesi kolayca paylaşılabilir. Proje bir bilgisayardan diğerine aktarılırsa ve projenin bağımlılıkları yeni bilgisayarın yerel deposunda bulunmuyorsa, bunlar indirilir.
Maven tek başına kullanılabileceği gibi, NetBeans veya Eclipse gibi bir EDI (Entegre Geliştirme Ortamı) içine de entegre edilebilir.
NetBeans'te bir Maven projesi oluşturalım:
![]() |
- [1]'te yeni bir proje oluşturun,
- [2]'te, [Maven] kategorisini ve [Java Application] proje türünü seçin,
![]() |
- [3]'te, yeni projenin klasörünün üst klasörünü belirleyin,
- [4]'te projeye bir ad verin,
- [5]'te, oluşturulan proje.
Projenin bileşenlerini inceleyelim ve her birinin rolünü açıklayalım.
![]() |
- [1]: projenin farklı dalları:
- [Source packages]: projenin Java sınıfları;
- [Test packages]: projenin test sınıfları;
- [Dependencies]: proje için gerekli olan ve Maven tarafından yönetilen .jar dosyaları;
- [Test Dependencies]: Projenin testleri için gerekli olan ve Maven tarafından yönetilen .jar dosyaları;
- [Java Dependencies]: proje için gerekli olan ve Maven tarafından yönetilmeyen .jar dosyaları;
- [Project Files]: Maven ve NetBeans yapılandırma dosyaları;
![]() |
- [3]'te, [Source Packages] dalı,
Bu dal, projenin Java sınıflarının kaynak kodlarını içerir. NetBeans varsayılan olarak bir sınıf oluşturmuştur:
package istia.st.mvexemple;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
![]() |
- [4]'te, projenin test sınıflarının kaynak kodlarını içeren [Test Packages] dalı,
- [5]'e dönüştürülmüştür; testlerin çalıştırılması için gerekli olan JUnit 3.8 kütüphanesi,
NetBeans varsayılan olarak bir sınıf oluşturdu:
package istia.st.mvexemple;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest extends TestCase {
/**
* Create the test case
*
* @param testName
* name of the test case
*/
public AppTest(String testName) {
super(testName);
}
/**
* @return the suite of tests being tested
*/
public static Test suite() {
return new TestSuite(AppTest.class);
}
/**
* Rigourous Test :-)
*/
public void testApp() {
assertTrue(true);
}
}
Bu, JUnit 3.8 sürümünde bir testtir. Daha sonra JUnit 4.x sürümündeki testleri kullanacağız.
![]() |
- [6]'te, [Dependencies] dalı burada boştur,
Bu dal, proje için gerekli olan ve Maven tarafından yönetilen tüm kütüphaneleri gösterir. Burada listelenen tüm kütüphaneler Maven tarafından otomatik olarak indirilir. Bu nedenle bir Maven projesinin İnternet erişimine ihtiyacı vardır. İndirilen kütüphaneler yerel olarak depolanacaktır. Başka bir proje, yerel olarak zaten mevcut olan bir kütüphaneye ihtiyaç duyarsa, bu kütüphane indirilmeyecektir. Göreceğiz ki, bu kütüphane listesi ve bunların bulunduğu depolar, Maven projesinin yapılandırma dosyasında tanımlanmıştır.
![]() |
- [7]'te, proje için gerekli olan ve Maven tarafından yönetilmeyen kütüphaneler,
![]() |
- [7]'te, Maven projesinin yapılandırma dosyası olan [pom.xml] dosyası. POM, Project Object Model anlamına gelir. Bu dosya üzerinde doğrudan değişiklik yapmamız gerekecektir.
Oluşturulan [pom.xml] dosyası şöyledir:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 5-8. satırlar, Maven projesi tarafından oluşturulacak Java nesnesini (artefakt) tanımlar. Bu bilgiler, proje oluşturulurken kullanılan sihirbazdan alınmıştır:
![]() |
Bir Maven nesnesi dört özellik ile tanımlanır:
- [groupId]: Paket adına benzeyen bir bilgidir. Böylece, Spring çerçevesinin kütüphaneleri groupId=org.springframework değerine sahipken, JSF çerçevesinin kütüphaneleri groupId=javax.faces değerine sahiptir,
- [artifactId]: Maven nesnesinin adı. [org.springframework] grubunda ise şu artifactId'ler bulunur: spring-context, spring-core, spring-beans, ... [javax.faces] grubunda ise artifactId ve jsf-api, bulunur
- [version]: Maven artefaktının sürüm numarası. Dolayısıyla org.springframework.spring-core artefaktının sürümleri şunlardır: 2.5.4, 2.5.5, 2.5.6, 2.5.6.SECO1, ...
- [packaging]: Artefaktın aldığı biçim; çoğunlukla war veya jar şeklindedir.
Maven projemiz, [istia.st] grubu (satır 5) içinde, [mv-exemple] adında (satır 6) ve [1.0-SNAPSHOT] sürümüne sahip (satır 7) bir [jar] oluşturacaktır (7. satır) adlı bir sürüm olacaktır. Bu dört bilgi, bir Maven artefaktını benzersiz bir şekilde tanımlamalıdır.
17-24. satırlar, Maven projesinin bağımlılıklarını, yani proje için gerekli kütüphanelerin listesini gösterir. Her kütüphane dört bilgi ile tanımlanır (groupId, artifactId, sürüm, paketleme). Burada olduğu gibi packaging bilgisi eksik olduğunda, packaging jar dosyası kullanılır. Buna, kütüphanenin projenin yaşam döngüsünün hangi aşamalarında gerekli olduğunu belirleyen scope bilgisi eklenir. Varsayılan değer olan compile, kütüphanenin derleme ve çalıştırma aşamalarında gerekli olduğunu belirtir. "test" değeri, kütüphanenin proje testleri sırasında gerekli olduğu anlamına gelir. Burada JUnit 3.8.1 kütüphanesi için durum budur. Bu kütüphane, bilgisayarın yerel deposunda bulunmuyorsa indirilir.
3.1.2. Projenin çalıştırılması
Projeyi çalıştırıyoruz:
![]() |
[1]'te, Maven projesi derlenir ve ardından [1] çalıştırılır. NetBeans konsolundaki günlükler şöyledir:
Sonuç 23. satırda görülmektedir. Bu basit örnekte bile Maven'ın bazı öğeleri indirdiği (17. ve 20. satırlar) görülmektedir.
3.1.3. Bir Maven projesinin dosya sistemi
![]() |
- [1]: projenin dosya yapısı [Files] sekmesinde yer almaktadır,
- [2]: Java kaynakları [src / main / java] klasöründedir,
- [3]: Testlerin Java kaynak kodları [src / test / java] klasöründedir,
- [4]: [target] klasörü, projenin derlenmesi (build) sırasında oluşturulmuştur,
- [5]: Burada, proje derlemesi [mv-exemple-1.0-SNAPSHOT.jar] adlı bir arşiv oluşturmuştur.
3.1.4. Yerel Maven deposu
Maven'in proje için gerekli bağımlılıkları indirip yerel olarak depoladığını belirtmiştik. Bu yerel depoyu şu şekilde inceleyebiliriz:
![]() |
- [1]'te, [Window / Other / Maven Repository Browser] seçeneğini seçtiğimizde,
- [2]'te, [Maven Repositories] sekmesi açılır,
- [3]'te iki dal bulunur; biri yerel depo, diğeri merkezi depo içindir. Merkezi depo devasa boyuttadır. İçeriğini görüntülemek için [4] dizinini güncellemek gerekir. Bu güncelleme işlemi onlarca dakika sürer.
![]() |
- [5]'te, yerel deponun kütüphaneleri,
- [6]'te, projemizin [groupId]'ine karşılık gelen [istia.st] dalı bulunur,
- [7]'te yerel deponun özelliklerine erişilir,
- [8]'te yerel deponun yolu bulunur. Bunu bilmek yararlıdır çünkü bazen (nadiren) Maven projenin en son sürümünü kullanmaz. Değişiklikler yaptığımızda bunların dikkate alınmadığını fark edebiliriz. Bu durumda, [groupId]'e karşılık gelen yerel depo dalını manuel olarak silebiliriz. Bu, Maven'ı projenin en son sürümünden dalı yeniden oluşturmaya zorlar.
3.1.5. Maven ile bir artefakt aramak
Şimdi Maven ile bir artefakt aramayı öğrenelim. [pom.xml] dosyasının mevcut bağımlılık listesinden başlayalım:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
17-23. satırlar, kütüphaneleri en güncel sürümlerinde kullanmak üzere değiştireceğimiz bağımlılıkları tanımlamaktadır.
![]() |
Öncelikle, mevcut [1] bağımlılıklarını kaldırıyoruz. Bunun üzerine [pom.xml] dosyası şu şekilde değiştiriliyor:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies></dependencies>
</project>
- satırda, kaldırılan bağımlılık artık [pom.xml] dosyasında görünmüyor. Şimdi bunu Maven depolarında arayalım.
![]() |
- [1]'te projeye bir bağımlılık eklenir,
- [2]'te, aranan artefaktla ilgili bilgileri (groupId, artifactId, sürüm, paketleme (Tür) ve kapsam) belirtmemiz gerekiyor. Öncelikle [groupId] ve [3]'i belirtiriz,
- [4]'te, olası artefaktların listesini görüntülemek için [espace] yazıyoruz. Burada [junit] ve [jnit-dep] görünüyor. [junit]'i seçiyoruz,
- aynı şekilde [5]'te de en yeni sürümü seçiyoruz. Paketleme türü jar,
- ve [6]'te, bağımlılığın yalnızca testler için gerekli olduğunu belirtmek amacıyla test kapsamını seçiyoruz.
![]() |
[6]'te, eklenen bağımlılıklar projede görünür. [pom.xml] dosyası bu değişiklikleri yansıtır:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
<type>jar</type>
</dependency>
</dependencies>
</project>
[pom.xml] dosyasında, [6]'te gördüğümüz [hamcrest-core-1.1] bağımlılığının belirtilmediğine dikkat edilmelidir. Bunun nedeni, bu bağımlılığın JUnit 4.10 sürümüne ait olması ve projenin kendisine ait olmamasıdır. Bu durum, [Dependencies] dalında farklı bir simgeyle belirtilmiştir. Bu dosya otomatik olarak indirilmiştir.
Şimdi, istediğimiz artefaktın [groupId]'ini bilmediğimizi varsayalım. Örneğin, Hibernate'i ORM (Nesne-İlişkisel Eşleştirici) olarak kullanmak istiyoruz ve tek bildiğimiz bu. Bu durumda şu adrese gidebiliriz:
![]() |
[1] sayfasına anahtar kelimeler girebiliriz. hibernate yazıp aramayı başlatalım.
![]() |
- [2]'te, [groupId], org.hibernate ve [artifactId], hibernate-core'i seçelim,
- [3]'ten 4.1.2-Final sürümünü seçelim,
- [4]'e geldiğimizde, [pom.xml] dosyasına yapıştıracağımız Maven kodunu elde ederiz. Bunu yapıyoruz.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.2.Final</version>
</dependency>
</dependencies>
</project>
[pom.xml] dosyasını kaydediyoruz. Bunun üzerine Maven, yeni bağımlılıkları indirmeye başlıyor. Proje şu şekilde gelişiyor:
![]() |
- [5]'e, [hibernate-core-4.1.2-Final] bağımlılığı. Bulunduğu depoda, bu [artifactId] dosyası da bir [pom.xml] dosyası ile tanımlanmaktadır. Bu dosya okundu ve Maven, [artifactId]'in bağımlılıkları olduğunu tespit etti. Bunları da indiriyor. İndirilen her [artifactId] dosyası için de aynı işlemi gerçekleştirecek. Sonuç olarak, [6] dosyasında doğrudan talep etmediğimiz bağımlılıklar bulunur. Bunlar, ana [artifactId] dosyasındakinden farklı bir simgeyle gösterilir.
Bu belgede, Maven’ı esas olarak bu özelliği için kullanıyoruz. Bu sayede, kullanmak istediğimiz bir kütüphanenin tüm bağımlılıklarını bilmemize gerek kalmaz. Bunları yönetme işini Maven’a bırakırız. Ayrıca, bir [pom.xml] dosyasını geliştiriciler arasında paylaşarak, her geliştiricinin aynı kütüphaneleri kullandığından emin oluruz.
Aşağıdaki örneklerde, kullanılan [pom.xml] dosyasını paylaşmakla yetineceğiz. Okuyucunun, belgeyle aynı koşullara sahip olmak için bu dosyayı kullanması yeterlidir. Ayrıca, Maven projeleri başlıca Java ortamları (Eclipse, NetBeans, IntelliJ, JDeveloper) tarafından desteklenmektedir. Bu sayede okuyucu, örnekleri test etmek için en sevdiği IDE'i kullanabilir.


















