V0.1

1 1.1.Maven Ne Yapar?

İÇİNDEKİLER 1.Giriş ve Kurulum ..........................................................................................................................................1 1.1.Maven Ne Yapar?......................................................................................................................................1 1.2.Kurulum....................................................................................................................................................1 1.3.1.Kurulum Ayrıntıları ............................................................................................................................ 2 1.4.Yerel Maven Deposu ve Ayarları .............................................................................................................. 2 2. POM ...........................................................................................................................................................3 2.1.Super POM .............................................................................................................................................. 4 2.2.En Basit Proje POM’u .............................................................................................................................. 5 2.3.Geçerli(Effective) POM ............................................................................................................................ 5 2.4.POM Söz Dizimi ...................................................................................................................................... 5 2.4.1.Proje Koordinatları ........................................................................................................................... 6 2.4.2.Proje Değişkenleri(Property References ) ......................................................................................... 6 2.5.Proje Bağımlılıkları(Dependency) .............................................................................................................7 2.6.Bağımlılık Kapsamları(Scope) ...................................................................................................................7 2.7.Geçişli Bağımlılıklar(Transitive Dependencıes) ........................................................................................ 8 2.7.1.Geçişli Bağımlıkları Projeden Çıkarma(Excludıng) ............................................................................. 8 2.8.Dependency Management Etiketi ........................................................................................................... 8 2.9.Bir Projeden Kalıtım Alma ....................................................................................................................... 9 2.10.Bağımlıkları Gruplamak ........................................................................................................................10 2.11Çok Modüllülük Mü? Kalıtım Mı? ............................................................................................................12 2.11.1.Basit Bir Proje .................................................................................................................................12 2.11.2Çok Modüllü Kurumsal Projeler .......................................................................................................12 3.İnşa Yaşam Döngüsü(Buıld Lıfecycle) ........................................................................................................14 3.1Clean(Temizle) Yaşam Döngüsü ..........................................................................................................14 3.2.Default(Varsayılan) Yaşam Döngüsü ...................................................................................................... 15 3.3.Site Yaşam Döngüsü ...............................................................................................................................16 3.4.Paketlemeye Özel Yaşam Döngüleri.......................................................................................................16 3.4.1.JAR Paketlemesi ..............................................................................................................................16 3.4.2.POM Paketlemesi ............................................................................................................................16 3.4.3.Maven Eklentisi Paketlemesi ........................................................................................................... 17 3.4.4.EJB Paketleme ................................................................................................................................. 17 3.4.5.WAR Paketleme............................................................................................................................... 17 3.4.6.EAR Paketleme ................................................................................................................................18

2 1.1.Maven Ne Yapar? 3.4.7.Diğer Paketleme Çeşitleri.................................................................................................................18 3.5.Sık Kullanılan Yaşam Döngüsü Hedefleri ................................................................................................18 3.5.1.Process Resources............................................................................................................................18 3.5.2.Compile(Derle) ................................................................................................................................19 3.5.3.Process Test Resources ................................................................................................................... 20 3.5.4.Test Compile .................................................................................................................................. 20 3.5.5.Test................................................................................................................................................. 20 3.5.6.Install(Yükle) ................................................................................................................................... 20 3.5.7.Deploy(Yayınla)............................................................................................................................... 20 4.Maven Komut Satırı ..................................................................................................................................21 4.1.Maven’ı Çalıştırmak ................................................................................................................................21 4.1.1.Sistem Değişkeni(Property) Tanımlamak .........................................................................................21 4.1.2.Yardımı Görüntülemek ....................................................................................................................21 4.1.3.İnşa Profillerini Etkinleştirmek .........................................................................................................21 4.1.4.Sürüm Bilgisini Görüntülemek .........................................................................................................21 4.1.5.Çevrimdışı Kipte Çalıştırmak ........................................................................................................... 22 4.1.6.Alternatif POM veya Ayar Dosyası Kullanmak ................................................................................ 22 4.1.7.Proje Hata Verirse Yapılacaklar ....................................................................................................... 22 4.1.8.Günlükleme Seviyesi....................................................................................................................... 22 4.1.9.Etkileşimsiz Kip(Batch Mode) ......................................................................................................... 22 4.1.10.Eklenti Güncellemelerini Yönetmek .............................................................................................. 22 4.1.11.Alt Modülleri İnşa Etmeyi Durdurma ............................................................................................. 22 4.2.Maven Yardım(Help) Eklentisi ............................................................................................................... 22 4.2.1.Eklentiler Hakkında Bilgi Almak .......................................................................................................23 5.Eklenti Ayarları ..........................................................................................................................................25 5.1.Eklentilerin Bağımlıkları ..........................................................................................................................25 5.2.Eklenti Parametrelerini POM’da Belirtmek .............................................................................................25 5.3.Çalıştırılan Hedeflere Özel Ayarlar ......................................................................................................... 26 5.4.Komut Satırı Parametrelerini POM’dan Ayarlamak ............................................................................... 26 6.Birleştirme(Assembly)Eklentisi ................................................................................................................. 27 6.1.Birliktelik Tarifleri(Assembly Descriptors)............................................................................................... 27 6.2.Örnek Bir Birliktelik İnşası....................................................................................................................... 27 6.3.Dahası ................................................................................................................................................... 28 7. Proje İskeletleri(Archetype) ..................................................................................................................... 29

3 1.1.Maven Ne Yapar? 7.1.Örnek Proje............................................................................................................................................ 29 7.2.Bazı Önemli Proje İskeletleri ...................................................................................................................30 Son Söz (Şimdilik :) ...................................................................................................................................... 31

4 1.1.Maven Ne Yapar?

1 1.1.Maven Ne Yapar?

1.GİRİŞ VE KURULUM

M

aven bir proje yönetim aracıdır. “Ben projelerimi zaten kendim (ya da IDE’m vasıtasıyla) yönetebiliyorum. Bunun için bir araca ne gerek var?”, demeyin. Eğer böyle diyorsanız muhtemelen projeleriniz Maven kullanmanızı gerektirecek büyüklükte değildir. Kurumsal projeler ise bazen o kadar büyük olabiliyor ki, Maven gibi araçlara ihtiyaç duyulabiliyor.

1.1.MAVEN NE YAPAR? Maven en başta projeleriniz (tipine göre) için standart bir dizin yapısı tanımlar. Bu sayede, örneğin siz Netbeans’te çalışıyorken Netbeans’in oluşturduğu dizin yapısı ile arkadaşınız Eclipse’de çalışıyorken Eclipse’in oluşturduğu dizin yapısı veya bunların kullandığı özel ayarlar yüzünden projelerin taşınabilirliğinin olmamasının önüne geçer. Kurumsal Java projeleri o kadar büyük olabilir ki, bazen 100’lerce 3. parti kütüphane jar’ı kullanmanız gerekebilir. Bu jarları internetten birbirleriyle uygun sürümlerine göre indirip IDE’nizde kütüphaneleri koyduğu yere koymanız, sonra ayrı ayrı javadoc ve kaynak kodlarını ayarlamanız ve bunları proje üzerinde geliştirme yapan herkesin standart bir şekilde uygulaması angarya olur. Öyle ki projeyi geliştirmekten çok yönetimine kafa patlatırsınız. Maven buna da çözüm getirir. Maven’ın yaklaşık 200 GB büyüklüğünde çevrimiçi bir deposu vardır. Siz Maven’a projenizde hangi kütüphaneyi kullanmak istediğinizi söylersiniz, o da bu depodan jarları indirip sizin yerel deponuza kaydeder ve projenin classpath’ını bu jarları da dâhil edecek şekilde değiştirir. Maven projenin yönetimi için standart bir yaşam döngüsü tanımlar: Temizle-Derle-Test Et-ÇalıştırYayınla… gibi. Siz çeşitli eklentilerle (plugin) bu döngüye müdahale edebilir, projenizin gerekliliklerine göre değiştirebilirsiniz. Maven’ın çekirdeği aslında çok basittir. Çekirdek sadece gerekli jarları internetten nasıl indireceğini ve XML dosyalarıyla yapılan ayarların nasıl uygulanacağını bilir. Bu yüzden çok hafiftir (lightweight). Eklentilerle Maven’ı ayarlamak size kalır. Maven projeler için kendi modelini tanımlar. Projenin ayar dosyasına girdiğiniz verileri (tanım, geliştiriciler, lisans, bağımlı olduğu diğer projeler v.s.) çok çeşitli işlerde kullanabilir. Bu açıklamaları kullanarak tek bir komutla projeye özel bir web sitesi bile oluşturabilir.

1.2.KURULUM Maven 3’ü http://maven.apache.org/download.html adresinden indirebilirsiniz. Kurulumunu sadece Windows’a göre anlatacağım. Çünkü zaten diğer işletim sistemlerini kullananlar biraz sonra anlatacağım ayarları kendi sitemlerinde nasıl yapacakları biliyorlardır. İndirdiğiniz sıkıştırılmış dosyayı C:\ dizinine açın. Bu dizinde şuna benzer bir klasör oluşmalı: C:\apache-maven-3.0.3 Bilgisayarım’a sağ tıklayıp Özellikler’e tıklayın (ya da Denetim Masası’ndan Sistem’i açın). Gelişmiş sekmesinde Çevre Değişkenlerine (Environment Variables) tıklayın. Sistem Değişkenleri (System Variables) altında Yeni’ye tıklayın. Değişken Adına: M2_HOME , değerine de C:\apache-maven-3.0.3 girin, Tamam’a tıklayın. Aynı pencerede tekrar Yeni’ye basın. Bu sefer değişken adına M2 değerine de %M2_HOME%\bin girin.

2 1.4.Yerel Maven Deposu ve Ayarları Yine aynı pencerede Path değişkenine tıklayıp, Düzenle’yi seçin. Değer kısmının en sonunda ; yoksa ekleyin, sonra da %M2% ‘yi ekleyin. Yine ayrı pencerede JAVA_HOME değişkeni yoksa ekleyin ve değerine JDK’nın bulunduğu dizinin yolunu verin. Örneğin C:\Program Files\Java\jdk1.6.0_24 Sonra Path değişkenine üstteki gibi % JAVA_HOME % ‘yi ekleyin. Windows+R tuşlarına basıp cmd ‘yi çalıştırın. Komut satırından mvn –v ‘yi çalıştırarak kurulumunuzu sınayın.

1.3.1.KURULUM AYRINTILARI Maven’ın yalın 3.0.3 sürümü yaklaşık 2.9 MB boyutunda. Bu kadar küçük olmasının nedeni, gerektiğinde ihtiyacı olduğu eklentileri kendi deposundan indirebiliyor olması. Maven kurulum dizini şu dosya ve klasörleri içerir: LICENSE.txt NOTICE.txt README.txt bin/ boot/ conf/ lib/ Bunlardan, bin/ içinde Maven’ı çalıştıran mvn komut kümesi (batch)’i barındırır. boot/ içinde Maven’ın çalıştırıldığı bir Sınıf Yükleyici (Class Loader)’yi oluşturan plexus-classworlds-2.4.jar dosyası vardır. conf/ klasöründe Maven’ın global ayarlarını bulunduran settings.xml’i barındırır.

1.4.YEREL MAVEN DEPOSU VE AYARLARI Maven’ı projelerinizde ilk kullanmaya başladığınızda, işletim sisteminizin kullanıcı dizininde (Win XP: C:\Documents and Settings\Foobar\.m2 ya da Linux: /home/foobar ya da ~/) .m2 adında bir klasör oluşturur. Bu klasör sizin yerel ayarlarınızın ve kütüphane (jar) deponuzun (repository) bulunduğu dizindir. Bu dizinde iki tane girdi olacaktır: ~/.m2/settings.xml : Kullanıcıya özel Maven ayarlarının bulunduğu dosya. ~/.m2/repository: Yerel Maven deposu. İnternetten indirilen jarlar buraya konulur. Eğer Maven’ın ayarlarını değiştirmek isterseniz ~/.m2/settings.xml dosyasında değişiklik yapmanız daha doğru olacaktır.

3 1.4.Yerel Maven Deposu ve Ayarları

2. POM

P

OM(Project Object Model) bir Maven projesinin kimliğinin ve yapısının tanımlandığı, ayarlarının yapıldığı, birbirleriyle ilişkilendirildiği bir Maven nesnesidir. POM, pom.xml dosyası içinde oluşturulur. Her Maven projesinin bir pom.xml dosyası vardır ve bu dosyanın bulunduğu dizin projenin ana dizini olarak kabul edilir. Bir projeyle ilişkili Maven komutları komut satırından o projenin pom.xml’inin bulunduğu dizinde çalıştırılır. Maven verilen komutları ilgili POM’daki ayarlara göre gerçekler. POM, Maven’a proje hakkında bilgi verir ve ön tanımlı Maven işlemlerini projeye göre nasıl değiştireceğini anlatır. POM dosyasına bakarsanız bir projeye ait şu sorulara cevap verdiğini görürsünüz: Kaynak kodlar ve yardımcı dosyalar nerede? Projenin yayınlanmış halinin dosya biçimi ne(JAR, WAR, EAR)? …v.b.

Şekil 2-1: POM dosyasının yapısı

Bir POM dosyası içinde 4 çeşit bilgi içerir: 1. Proje Hakkında Genel Bilgiler: Projenin adı, internet sitesi, geliştiricileri, lisans bilgileri… v.s. 2. İnşa(Build) Ayarları: Burada Maven’ın ön tanımlı inşa ayarları projenin ihtiyaçlarına göre yeniden düzenlenir. Kaynak dosyaların yeri, eklentiler ve ayarları… 3. İnşa Kapsamı(Build Environment): Bu kısımda farklı inşa seçeneklerine göre profiller tanımlanır. Örneğin; geliştirme aşaması için ayrı son kullanıcı ortamı için ayrı… 4. POM ilişkileri: Projelerin birbirleriyle ilişkileri burada tanımlanır. Ebeveyn proje, alt modüller…

4 2.1.Super POM

2.1.SUPER POM Bütün Maven projeleri bir Super POM’dan kalıtım alır. Bu ana POM’un içinde projeler için ortak ön tanımlı değerler vardır. Dosyaya buradan ulaşabilirsiniz: pom-4.0.0.xml . Dosyayı anlamaya çalışmayın biraz sonra hepsini tek tek izah edeceğim. 4.0.0 Maven Default Project central [1] Maven Repository Switchboard default http://repo1.maven.org/maven2 false central Maven Plugin Repository [2] http://repo1.maven.org/maven2 default false never [3] ${project.basedir}/target ${project.build.directory}/classes ${project.artifactId}-${project.version} ${project.build.directory}/test-classes ${project.basedir}/src/main/java src/main/scripts ${project.basedir}/src/test/java ${project.basedir}/src/main/resources ${project.basedir}/src/test/resources

5 2.2.En Basit Proje POM’u [4] maven-antrun-plugin 1.3 maven-assembly-plugin 2.2-beta-2 …………………………………. target/site


Bu Super POM bütün Maven projeleri tarafından kalıtım alınan bazı ön tanımlı değerler belirtir. [1]central adında bir tane uzak Maven deposu tanımlanmıştır. Maven, projenizin POM’una eklediğiniz bağımlılıkları bulmak için önce bu depoya bakacaktır. [2]Eklentiler için tanımlanmış Maven deposu. [3]Bütün Maven projeleri için ön tanımlı inşa ayarları. Örneğin buna göre projenizin kaynak kodları, projenin ana dizini (pom.xml’in bulunduğu) altında src/main/java içinde olacaktır. [4]Projede kullanılabilecek eklentiler ve sürüm numaraları.

2.2.EN BASİT PROJE POM’U Super POM’da tanımlı ön tanımlı değerleri kullanarak basit bir Maven projesi oluşturmak isterseniz, projeniz için şu şekilde bir POM tanımlamanız yeterli olacaktır. 4.0.0 org.sonatype.mavenbook.ch08 simplest-project 1

Yukarıdaki POM’a göre bu proje çıktı olarak bir JAR dosyası veren, diğer hiçbir projeyle bağlantısı olmayan, hiçbir bağımlılığı olmayan bir projedir. Eğer bu pom.xml dosyasını bir dizinde oluşturur, sonra src/main/java içine birkaç kaynak kod dosyası koyup, pom.xml’in bulunduğu dizinde mvn package komutunu çalıştırırsanız proje dizininde bir target/ klasörü oluşacak ve içine de simple-project-1.jar dosyası koyulacaktır.

2.3.GEÇERLİ(EFFECTİVE ) POM Projenin kendi POM’u ile birlikte Super POM’un ve bütün ebeveyn POM’ların bir araya topladığı POM’dur. mvn help:effective-pom komutuyla erişilebilir.

2.4.POM SÖZ DİZİMİ

6 2.4.POM Söz Dizimi pom.xml dosyası tahmin edebileceğiniz gibi bir XML dosyasıdır ve XML söz dizimini kullanır. Şimdi bir POM dosyasında bulunan satırların ne anlama geldiklerini öğrenelim.

2.4.1.PROJE KOORDİNATLARI Proje koordinatları, bir projenin Maven dünyasındaki benzersiz kimliğidir. Bu koordinatlar proje ana Maven deposuna yüklenirse projenin kolayca bulunup indirilmesini sağlar. Örneğin en basit proje POM’unun koordinatlarını inceleyelim: groupId: Birbiriyle ilişkili projeleri bir araya getirir. Genelde bir şirketin bütün projeleri aynı groupId’ye sahip olur. artifactId: Artifact, bir projenin yayınlanması sonucu oluşan dosyalara (JAR, EAR, WAR) verilen genel addır. Proje adı da denilebilir. Bir projenin groupID+artifactID birleşimi benzersiz olmalıdır. Karışıklığı önlemek için artifactId içinde nokta(.) kullanmayın. version: Sürüm numarası. Bu numaradan sonra SNAPSHOT kelimesi eklemek projenin halen aktif olarak geliştirmekte olduğu anlamına gelir. Eğer bir sürüm numarası SNAPSHOT kelimesini içeriyorsa, Maven yayınlaması sırasında projenin adına, projenin inşa edildiği tarih saat bilgisini UTC formatında ekler.

2.4.2.PROJE DEĞİŞKENLERİ(PROPERTY REFERENCES ) POM dosyasında çeşitli değişkenler tanımlayabilir ve bunlara ya da Maven’ın ön tanımlı değişkenlerine erişebilirsiniz. Bu değişkenleri kullanabilmek için erişmek istediğiniz değişkeni ${…} içine yazmanız yeterlidir. Maven bir POM dosyasını okurken, bu değişkenleri gerçek değerleri ile değiştirip, asıl POM’u oluşturacaktır. 4 çeşit ön tanımlı değişken grubu vardır. 1. env: İşletim sisteminin çevre değişkeleri. Örneğin: ${env.PATH} 2. project: Projeye ait değişkenlerdir. Örneğin: ${project.groupId} veya ${project.artifactId} 3. settings: yerel Maven deposuna bulunan settings.xml dosyasındaki değişkenlerdir. Örneğin Maven’ın internete bağlanmadan çalışması sağlayan offline elemanına ${settings. offline} ile erişilebilir. 4. Java Sistem Değişkenleri: java.lang.System sınıfının getProperties() metodu ile erişilebilen bütün değişkenlerdir. Örneğin: ${user.name}, ${user.home}, ${java.home} Bunların dışında kendi değişkenlerinizi de pom.xml’in ya da settings.xml’in içinde properties öğesi(element) altında tanımlayabilirsiniz. Örneğin şu şekilde tanımladığınız foo değişkenine, bar

${foo} ile ulaşabilirsiniz. Dönülen değer bar olacaktır. Şimdi proje değişkenlerini kullanan gerçek bir örnek yapalım. Aşağıdaki şekilde tanımlanan bir pom.xml için, 4.0.0 org.sonatype.mavenbook project-a 1.0-SNAPSHOT jar ${project.groupId}${project.artifactId}

7 2.5.Proje Bağımlılıkları(Dependency) mvn help:effective-pom komutu çalıştırılırsa, dönen POM’un şu şekilde değiştiği görülür: ... org.sonatype.mavenbook-project-a ...

2.5.PROJE BAĞIMLILIKLARI (DEPENDENCY) Bir projenin bağımlılıkları, o projenin çalışması için gerekli olan JDK dışındaki 3. parti kütüphanelerdir(jar). Bağımlıkları aşağıdaki gibi projenin POM’unda tanımlayabilirsiniz. Proje üzerinde herhangi bir Maven komutu çalıştırıldığında, Maven bu jarları uzak deposundan sizin yerel deponuza indirecek ve projenin classpath’ını ona göre ayarlayacaktır. Herhangi bir bağımlılık tanımı aşağıdaki gibi yapılabilir. ... org.codehaus.xfire xfire-java5 1.2.5 junit junit 3.8.1 test javax.servlet servlet-api 2.4 provided ...

Bu bağımlılık tanımları size tanıdık gelmeli. Nasıl daha önce biz kendi projemiz için koordinat(groupId ve artifactId) tanımladıysak, şimdi de başkalarının projelerine erişmek için onların koordinatlarını kullanıyoruz.

2.6.BAĞIMLILIK KAPSAMLARI (SCOPE) Üstteki bağımlılık tanımlarında fazladan bir girdi dikkatinizi çekmeli: scope(kapsam). Bir bağımlılığın kapsamı, onun proje yayınlanırken veya geliştirilirken yayınlandığı veya geliştirildiği ortamın classpath’inde zaten bulunup bulunmadığını (örneğin projeniz Glassfish ortamında çalışacaksa, bazı kütüphaneler projeniz için Glassfish tarafından sağlanır. Bunun için bu bağımlılıkları projenin son haline eklemenize gerek yoktur. Ancak bunlar proje geliştirilirken projenin çalışması için gereklidir ve classpath’de bulunmalıdır). Maven 5 tane bağımlılık kapsamı tanımlar: Compile(Derleme): Varsayılan kapsamdır. Kapsam bilgisi verilmeyen bütün bağımlıklar derleme kapsamında değerlendirilir. Kapsamı derleme olan bağımlıklar, bütün classpath’lara (geliştirme ve yayınlama) dâhil edilir ve projenin yayınlandığı paketin(package) içine de konur. Provided(Sağlanmış): Bu tip kapsamı olan bağımlıklar projenin çalışacağı son kullanıcı ortamında JDK veya başka araçlar tarafından (uygulama sunucusu v.b.) zaten bulunduruluyorsa ve sadece

8 2.7.Geçişli Bağımlılıklar(Transitive Dependencıes) geliştirme ortamında derlemek için gerekliyse kullanılır. Projenin son haline dâhil edilmezler(nonpackaged). Runtime(Çalışma Zamanı): Projenin çalışması ve test edilmesi için gerekli ancak derlenmesi için gerekli olmayan bağımlıklardır. Örneğin JDBC Sürücüleri. Test: Projenin çalışması için gerekli olmayan ancak testlerin derlenmesi ve çalışması için gerekli olan bağımlıklardır. System: Provided(sağlanmış) kapsamla aynıdır. Ancak bu tür bağımlıkların sistemdeki yolunu ayrıca belirtmeniz gerekir. Platforma özgü (dll v.b.) bağımlıklar bu şekilde tanımlanabilir. Taşınabilirliği azalttığı için kullanmaktan mümkün olduğunca kaçının.

2.7.GEÇİŞLİ BAĞIMLILIKLAR (TRANSİTİVE DEPENDENCIES) Bilmem hatırlar mısınız? Lise 1 matematiğinde Kartezyen Çarpım diye bir konu vardır. Kartezyen Çarpım’ın geçişlilik özelliğine göre A’dan B’ye, B’den de C’ye ulaşılabiliniyorsa, A’dan C’ye de ulaşılabilir demektir. Aslında bu örnek bu konuyu özetliyor. Kendi projemize A, A’nın herhangi bir bağımlılığına B(örneğin Spring Çatısı) diyelim. B’nin de kendi içinde C diye bir bağımlılığı olsun(örneğin log4j). Bu durumda C, A’nın geçişili bağımlılığıdır. Siz projenin POM’unda belirtmeseniz bile, C bağımlılığı classpath’ınıza eklenecektir. Daha önce Maven kullananlar dikkat etmiştir. Siz POM’a koymasanız bile bazı IDE’ler geçişli bağımlıkları eklediğiniz kütüphaneler arasında soluk bir renkte (genelde gri) gösterir.

2.7.1.GEÇİŞLİ BAĞIMLIKLARI PROJEDEN ÇIKARMA(EXCLUDING) Bazen bir geçişli bağımlılığı projenin classpath’ından çıkarıp yerine aynı özellikleri sağlayan başka bir kütüphaneyi eklemek isteyebilirsiniz. Bunun için çıkarmak istediğiniz bağımlılığı exclusion etiketleri arasına almanız yeterlidir. Yerine koymak istediğiniz bağımlılığı da projenize normal bir bağımlılık ekler gibi ekleyebilirsiniz. org.hibernate hibernate 3.2.5.ga javax.transaction jta org.apache.geronimo.specs geronimo-jta_1.1_spec 1.1

2.8.DEPENDENCY MANAGEMENT ETİKETİ Daha önce de belirttiğim gibi projeleriniz için bir ebeveyn POM tanımlayabilirsiniz. Bu ebeveyn POM’dan kalıtım alan bütün çocuk projeler, ebeveynlerinde tanımlanmış bütün bağımlıkları otomatik olarak classpath’larında barındıracaklardır.

9 2.9.Bir Projeden Kalıtım Alma Eğer yine ebeveyn POM’unuzda bağımlıklar tanımlamak ama bunların otomatik olarak kalıtım alınmasını istemiyor ya da kalıtım alınan bağımlılığın sürüm numarasını çocuk projede değiştirmek istiyorsanız dependencyManagement elemanını kullanabilirsiniz. Örneğin dependencyManagement elemanını aşağıdaki gibi tanımlayabilir, 4.0.0 org.sonatype.mavenbook a-parent 1.0.0 ... mysql mysql-connector-java 5.1.2 ... ........

Sonra bu bağımlılığın sürüm numarasını çocuk projede aşağıdaki gibi değiştirebilirsiniz: 4.0.0 org.sonatype.mavenbook a-parent 1.0.0 project-a ... mysql mysql-connector-java

2.9.BİR PROJEDEN KALITIM ALMA POM’larında birçok ortak kısım bulunan projeleriniz için, bu ortak kısımların bir arada bulunduğu bir ebeveyn POM tanımlayabilir ve projelerinizin bu POM’dan kalıtım almasını sağlayabilirsiniz. Aslında bütün Maven POM’ları bir ebeveyn POM’dan kalıtım alır. Kalıtım alınan POM özellikle belirtilmemişse, Super POM’dan kalıtım alınır. Bir proje için ebeveyn tanımlamak için parent etiketini kullanmalısınız:

10 2.10.Bağımlıkları Gruplamak

com.training.killerapp a-parent 1.0-SNAPSHOT project-a ...

Burada ebeveyni a-parent olan project-a adında bir proje tanımlıyoruz. Bu projenin POM haritası şu şekilde olacaktır:

Şekil-1.2: Project-A nın kalıtım şeması

Ebeveyn POM’u olan bir projenin artifacId elemanını overrride etmesi zorunlu değil ama mantıken gereklidir. Düşünün bir kere: Projenin bir ebeveyni olacağına göre bunların groupId’sinin ortak olması normaldir. Çünkü bu projeler ortak bir gruba dâhil oldukları için bir ebeveyn altında toplamaktayız. Ancak artifactId’si farklı olmalıdır. Çünkü aynı gruba dahil yeni bir proje tanımlamaktayız. Sürüm numaraları da genelde ortak olur. Bu da aynı ana proje altında geliştirme yaptığımız içindir. Bir çocuk proje ebeveyninden şu tanımlamaları kalıtım alır: Proje koordinatları (groupId ya da artifackId’den birisi override edilmelidir.), bağımlılıklar, geliştirici bilgileri, eklentiler listesi, raporlar listesi, eklenti ayarları. Maven ön tanımlı olarak ebeveyn POM’un yerel depoda veya bir üst dizinde (çocuk POM’un üst dizininde) olduğunu varsayar. Eğer bu yerlerden hiçbirinde değilse relativePath etiketi kullanılarak belirtilmelidir. org.sonatype.mavenbook a-parent 1.0-SNAPSHOT ../a-parent/pom.xml project-a AĞIMLIKLARI RUPLAMAK

2.10.B

G

11 2.10.Bağımlıkları Gruplamak Genelde bir arada kullandığınız bağımlıkları gruplayabilirsiniz. Böylece bunları kullanan projeleriniz için sisteminizde bir düzen sağlamış olursunuz. Örneğin Spring Çatısını kullandığınız her projede Hibernate’i ve MySQL JDBC sürücüsünü de kullanıyorsanız, bunları bağımlılık olarak bir araya getiren bir POM oluşturabilirsiniz. Bu POM’u Spring-Hibernate-MySQL adıyla kaydedebilirsiniz. Örneğin: org.sonatype.mavenbook Spring-Hibernate-MySQL 1.0 pom org.hibernate hibernate ${hibernateVersion} org.hibernate hibernate-annotations ${hibernateAnnotationsVersion} org.springframework spring-hibernate3 ${springVersion} mysql mysql-connector-java ${mysqlVersion} (5.1,) (2.0.6,) 3.2.5.ga 3.3.0.ga

POM’un packaging etiketinin POM olarak belirtildiğine dikkat edin. Bu POM’u Spring-Hibernate-MySQL klasörüne kaydedip, mvn install komutunu çalıştırırsanız, yerel deponuzda aynı adlı klasörde kaydedilecektir. Artık bu projeyi bağımlılık olarak (type etiketini POM olarak belirtmeyi unutmayın) diğer projelerinize eklediğinizde Spring-Hibernate-MySQL projesinin bağımlılıkları geçişli bağımlılık olarak projenize eklenecektir. This is a project requiring JDBC ... ... org.sonatype.mavenbook persistence-deps 1.0 pom

12 2.11Çok Modüllülük Mü? Kalıtım Mı?

2.11ÇOK MODÜLLÜLÜK MÜ? KALITIM MI? Başlıktan da anlayabileceğiniz gibi bazen Maven’a yeni başlayanlar için bu iki özellik arasındaki farkı kavramak sıkıntılı olabiliyor. Şimdi ikisinin de hangi durumlarda kullanılabileceğine dair birer örnek görelim.

2.11.1.BASİT BİR PROJE Biz bu kitabı (Ç.N:Türkçesi değil İngilizcesi) bir araya getirirken Maven kullandık (Maven proje yönetme konusunda dilden bağımsızdır. Şu an piyasada Maven’a diğer dillerin desteğini kazandıran eklentiler mevcut. Ki biz de metin tabanlı bir projeyi (kitap) Maven’la yönetebiliyoruz). Bir Maven projesi olarak bu kitap için maven-book adında çok modüllü bir proje oluşturduk. Bu proje iki tane alt proje içeriyor: book-examples ve book-chapters. Bu projeler maven-book’un alt modülleri olsa da maven-book’tan kalıtım almıyor. Böylece book-examples projesinin maven-book projesi hakkında hiçbir fikri yok ve onun alt projesi olduğunu da bilmiyor.

Şekil 0-1: maven-book projesinin yapısı

Resimden bir şey dikkatinizi çekmiş olabilir. Bu üç proje de com.sonatype.sonatype projesinden kalıtım alır. Bunun nedeni bu üç projenin birbiriyle ilişkili olması değil, sadece bizim Sonatype olarak bütün projelerimizi bir üst POM altında toplamamız. Böylece yönetilmeleri kolay oluyor. Yani konumuzla bir alakası yok. Siz de kendi projeleriniz için böyle bir yöntem uygulayabilirsiniz. Sonuç olarak maven-book projesi book-chapters ve book-exaples projeleri için sadece bir araya getirici özelliğe sahiptir.

2.11.2ÇOK MODÜLLÜ KURUMSAL PROJELER Şimdi de piyasa ortamındaki projeler hakkında daha çok fikir veren nispeten daha büyük bir projeyi inceleyelim.

13 2.11Çok Modüllülük Mü? Kalıtım Mı?

Şekil 2-2:Kurumsal proje yapısı

Yukarıdaki resimde big-system adında bir çok modüllü kurumsal proje örneği görüyorsunuz. Bu projenin server-side ve client-side adında iki alt modülü vardır. Hepsi de biraz önceki örnekte olduğu gibi aynı POM’dan kalıtım almakta. İki alt projenin big-system’den kalıtım almasını bekleyebilirsiniz. Üçünün POM’unda ortak kısımların azlığı nedeniyle buna gerek yok. Şimdi bu alt modüllerden server-side’ı inceleyelim. server-side, server-lib adında tekil ve web-apps adında çok modüllü olmak üzere iki alt projeye sahip. Bunların hepsi server-side’dan kalıtım almaktadır. Çünkü hepsi de sunucu tarafında buluyor ve ortak bağımlıkları var. Yine web-apps da client-web ve admin-web adında iki alt modüle sahip ve bunlar da web-apps’dan kalıtım alıyor. Çünkü yine ikisi de web uygulaması ve ortak olan birçok bağımlılığı var. Bu örneklerde ebeveyn-çocuk ilişkisi kullanmamızın temel nedeni ortak olan bağımlıkları,mantıksal olarak ilişkili oldukları (web tarafı, sunucu tarafı, istemci tarafı…) ve benzer ayarları içerdikleri için. Son söz: Bağımlıkların ve inşa ayarlarının ortak olduğu projeler ebeveyn-çocuk ilişkine alınabilir. Ancak aralarında böyle bir ortaklık yoksa bu gereksizdir. Ama büyük bir sistemin parçalarıysa bir çok modüllü projenin alt modülü olabilirler.

14 2.11Çok Modüllülük Mü? Kalıtım Mı?

3.İNŞA YAŞAM DÖNGÜSÜ(BUILD LIFECYCLE) Bu bölümde, Maven herhangi bir komut icra ederken geçtiği evreleri, eklentiler sayesinde bu evrelere müdahale edip nasıl projemizin ihtiyaçlarına göre değiştirebileceğimizi öğreneceğiz. Maven geleneğine göre Maven’ın anladığı komutlara hedef(goal) denir. Hedefler Maven eklentilerine gömülmüştür. Eklentiler de inşa yaşam döngüsünün evrelerine(phase) bağlanmıştır. Buna göre ihtiyaçlarımıza göre Maven’ın herhangi bir inşa evresine müdahale etmek için, projemize gerekli elentileri ekleyip, bunların istediğimiz hedeflerini çalıştırmalıyız. Maven’a bir projeyi inşa et dediğimizde aslında, inşa ile ilgili evreleri gerçeklemesini, bunu yaparken de her evrede o evreyle ilişkilendirilmiş hedefleri çalıştırmasını söylemiş oluruz. Maven’ın 3 tane standart yaşam döngüsü vardır: clean, default(build) ve site.

3.1CLEAN(TEMİZLE) YAŞAM DÖNGÜSÜ Bu evrede inşa dizini silinerek projenin daha önce inşa edilmiş çıktıları silinir. İnşa dizini ön tanımlı olarak ${basedir}/target dizinidir. Temizle yaşam döngüsü 3 evreden oluşur: pre-clean, clean, post-clean. mvn clean komutu clean yaşam döngüsünü tetikler ve Maven bu üç evreyi de sırasıyla çalıştırır. Not: Eklentiler ve Hedefler Maven’da bir eklentinin tüm hedeflerinin çalışmasını istiyorsanız, eklentinin adını belirtmeniz yeterlidir. Örneğin mvn clean komutu Temizle eklentisini dolayısıyla Temizle yaşam döngüsünü çalıştırır. Ancak sadece belli bir hedefin çalışmasını istiyorsanız, eklenti-adı:evre-adı biçiminde belirtmeniz gereklidir. Örneğin mvn clean:pre-clean veya mvn clean:clean. Bu komutlar sırasıyla clean eklentisinin pre-clean ve clean evrelerini çalıştırır. Clean eklentisi Temizle yaşam döngüsünü yönetir. Eğer temizleme işleminden önce veya sonra herhangi bir şey yapılmasını istiyorsanız, POM dosyasında eklentiler(plugins) altında belirtebilirsiniz. Örneğin bu POM’da pre-clean evresinde maven-antrun-plugin eklentisi çalıştırılır:

15 3.2.Default(Varsayılan) Yaşam Döngüsü

... maven-antrun-plugin file-exists pre-clean run ... ant-contrib ant-contrib 1.0b2

3.2.DEFAULT(VARSAYILAN ) YAŞAM DÖNGÜSÜ Maven’ın projeyi inşa ettiği yaşam döngüsüdür. Şu evrelerden oluşur: Evre validate generate-sources process-sources generateresources processresources compile process-classes generate-testsources process-testsources generate-testresources process-test-

Açıklama Validate the project is correct and all necessary information is available to complete a build Generate any source code for inclusion in compilation Process the source code, for example to filter any values Generate resources for inclusion in the package Copy and process the resources into the destination directory, ready for packaging Compile the source code of the project Post-process the generated files from compilation, for example to do bytecode enhancement on Java classes Generate any test source code for inclusion in compilation Process the test source code, for example to filter any values Create resources for testing Copy and process the resources into the test destination directory

16 3.3.Site Yaşam Döngüsü resources test-compile test prepare-package

package pre-integrationtest integration-test post-integrationtest verify install deploy

Compile the test source code into the test destination directory Run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed Perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package (coming in Maven 2.1+) Take the compiled code and package it in its distributable format, such as a JAR, WAR, or EAR Perform actions required before integration tests are executed. This may involve things such as setting up the required environment Process and deploy the package if necessary into an environment where integration tests can be run Perform actions required after integration tests have been executed. This may include cleaning up the environment Run any checks to verify the package is valid and meets quality criteria Install the package into the local repository, for use as a dependency in other projects locally Copies the final package to the remote repository for sharing with other developers and projects (usually only relevant during a formal release)

3.3.SİTE YAŞAM DÖNGÜSÜ Maven sadece bir inşa aracı değildir. Projeniz için belgelendirme yapabilir, web sitesi oluşturabilir. Site yaşam döngüsü 4 evreden oluşur: pre-site, site, post-site, site-deploy. Bu evreleri Maven’ın site eklentisi yönetir. Çalıştırmak için site:site ve site:deploy komutlarını kullanabilirsiniz.

3.4.PAKETLEMEYE ÖZEL YAŞAM DÖNGÜLERİ Paketleme biçimi bir projenin inşa edilmesi için gerekli adımları etkiler. Maven’da her farklı paketleme çeşidi için farklı hedefler tanımlanmıştır.

3.4.1.JAR PAKETLEMESİ Maven’ın ön tanımlı paketleme biçimidir. Projede packaging etiketi belirtilmezse, proje JAR ile paketlenir. JAR paketlemeye özel hedefler şunlardır: Evre process-resources compile process-test-resources test-compile test package install deploy

Hedef resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar install:install deploy:deploy

3.4.2.POM PAKETLEMESİ

17 3.4.Paketlemeye Özel Yaşam Döngüleri En basit paketleme çeşididir. Derlenecek, inşa edilecek hiçbir kaynak kodu v.s. yoktur. POM paketlemeye özel hedefler şunlardır: Evre Package install deploy

Hedef site:attach-descriptor install:install deploy:deploy

3.4.3.MAVEN EKLENTİSİ PAKETLEMESİ JAR paketlemeye benzer. Ayrıca 3 ek hedef daha vardır: plugin:descriptor, plugin:addPluginArtifactMetadata, ve plugin:updateRegistry. Bu hedefler eklenti için bir açıklayıcı(descriptor) dosya oluşturur ve depo bilgisinde için bazı değişiklikler yapar. Evre generate-resources process-resources compile process-test-resources test-compile test package install deploy

Hedef plugin:descriptor resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar, plugin:addPluginArtifactMetadata install:install, plugin:updateRegistry deploy:deploy

3.4.4.EJB PAKETLEME Maven EJB 2 ve 3’ü destekler. Ön tanımlı değer EJB 2’dir. EJB 3 için EJB eklentisini ayarlamalısınız. Evre process-resources compile process-test-resources test-compile test package install deploy

Hedef resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test ejb:ejb install:install deploy:deploy

3.4.5.WAR PAKETLEME JAR ve EJB paketlemeye benzer. Tek fark package hedefinin war:war olmasıdır. Bu hedef src/main/webapp/WEB-INF dizininde web.xml dosyasının olmasını gerektirir. Evre process-resources compile process-test-resources test-compile test

Hedef resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test

18 3.5.Sık Kullanılan Yaşam Döngüsü Hedefleri package install deploy

war:war install:install deploy:deploy

3.4.6.EAR PAKETLEME En basit Java EE yapılarıdır. Bir application.xml, kaynak kodlar ve birkaç modülden oluşur. EAR eklentisinin generate-application-xml adında bir hedefi vardır. Bu hedef POM’daki ayarlara göre application.xml’i oluşturur. Evre generate-resources process-resources package install deploy

Hedef ear:generate-application-xml resources:resources ear:ear install:install deploy:deploy

3.4.7.DİĞER PAKETLEME ÇEŞİTLERİ Maven’ın desteklediği paketleme çeşitleri bunlarla sınırlı değildir. 3. Parti eklentiler yardımıyla projenize burada yazılmayan paketleme biçimlerinin desteğini kazandırabilirsiniz. Örneğin: NAR, SWF, SWC… Bu paketleme biçimlerini kullanabilmeniz için, istediğiniz paketleme için yaşam döngüsü barındıran bir eklenti ve bu eklentiyi barındıran bir depoya ihtiyacınız olacaktır.

3.5.SIK KULLANILAN YAŞAM DÖNGÜSÜ HEDEFLERİ 3.5.1.PROCESS RESOURCES Birçok yaşam döngüsü process-resources evresinde resources:resources (resources eklentisinin resources hedefi) hedefini çalıştırır. Bu evrede kaynak dosyalar “işlenir” ve çıktı dizinine kopyalanır. Bu kopyalama işlemi ${basedir}/src/main/resources dizininden ${basedir}/target/classes dizinine yapılır. Bunun dışında bir de kaynak dosyalar arasında filtreleme yapılır ki, böylece aynen POM dosyasında ${…} işaretleri arasında değişken tanımladığınız gibi değişkenler tanımlayabilir ve bunların bu evrede dışarıdan okunan gerçek değerleriyle değiştirilmesini sağlayabilirsiniz. Bu duruma bir örnek vermek gerekirse: Farz edin, src/main/resources/META-INF/service.xml dizini altında service.xml adında bir XML dosyası olan bir projeniz var. Bu dosyada kullanacağınız veritabanı adresi, kullanıcı adı ve şifresi gibi bilgileri dışarıdan bir *.properties dosyasından okumak istiyorsunuz. Bu services.xml dosyası şu biçimde olabilir: ${jdbc.url} ${jdbc.username} ${jdbc.password}

Şimdi de bu değişkenlerin değerlerinin tanımlandığı default.properties dosyasını görelim: jdbc.url=jdbc:hsqldb:mem:mydb jdbc.username=sa jdbc.password=

19 3.5.Sık Kullanılan Yaşam Döngüsü Hedefleri Filtrelemeyi gerçekleştirebilmek için POM dosyamızda iki girdi tanımlamalıyız: İnşa ayarları altında filters etiketi içinde properties dosyalarının bir listesi ve resources etiketi altında filtrelemenin etkileyeceği dosyaların bulunduğu dizin. Ayrıca yine burada filtering etiketini true olarak ayarlamamız gerekir. src/main/filters/default.properties src/main/resources true

Kaynak dosyalarınız için src/main/resources adresine mahkûm değilsiniz. src/main adında herhangi bir dizini kullanabilirsiniz. Bu evreye müdahale ederek projenizin kaynak dosyaları üzerinde bundan daha gelişmiş işlemler de uygulayabilirsiniz. Benim bu konu için anlatacaklarım bu kadar. Ayrıntılı bilgi için kitabın İngilizce orijinaline bakabilirsiniz.

3.5.2.COMPİLE(DERLE) Derleyici eklentisi compile:compile evresinde src/main/java içindeki kaynak kodları derleyip target/classes altına koyar. Derleme işlemi için arka planda javac aracını çağırarak yapar. Burada Maven’a yeni başlayanlar için sinir bozucu bir ayrıntı var. Eklenti javac aracını çağırırken kaynak JVM sürümü olarak 1.3, hedef JVM sürümü olarak 1.1’i seçer. Eğer Java’ya 1.5 sürümü ile gelmiş olan Jenerik tipleri kullanacaksınız, kaynak ve hedef JVM sürümünü 1.5 ve üzerine ayarlamanız gerecektir. Bunun için şu POM parçasını kullanabilirsiniz: ... ... maven-compiler-plugin 1.5 1.5 ... ...

Bu ayarlar derleme eklentisinin bütün hedeflerini etkiler. Eğer sadece compile:compile evresini etkilemesini istiyorsanız configuration öğesini bu evreye ait bir execution öğesi altına yerleştirmelisiniz. Biz bu şekilde yaptık çünkü daha sonra compile:testCompile hedefi ile testlerimizi derlerken aynı ayarlara tekrar ihtiyacımız olacak.

20 3.5.Sık Kullanılan Yaşam Döngüsü Hedefleri

3.5.3.PROCESS TEST RESOURCES process-resources ile hemen hemen aynıdır. src/test/resources, altındaki test kaynaklarını target/testclasses altına kopyalar.

3.5.4.TEST COMPİLE Derleyici eklentisinin compile:testCompile hedefi çalıştırılıp src/test/java içindeki kaynak kodları derleyip target/test-classes altına koyar.

3.5.5.TEST Maven’ın birim testlerini yöneten eklentisi Surfire’dir. Surfire ön tanımlı olarak test dizini altındaki *Test ile biten bütün sınıfları JUnit testi olarak çalıştırır. Ancak test çatısı olarak TestNG’yi de kullanabilirsiniz. Bunun için POM’unuzda birkaç ayar yapmanız gerekir. Testlerinizi mvn test komutuyla çalıştırabilirsiniz. Testle çalıştırıldıktan sonra Surefire eklentisi target/surfire-reports altında çalıştırılan her test için çalıştırma bilgisini içiren bir XML dosyası, bir de test sonuçlarını içeren metin dosyası oluşturur. Eğer testler sırasında herhangi bir sorun oluşursa buradaki raporlara bakarak detaylı bilgi edinebilirsiniz. Surfire eklentisi ön tanımlı olarak, testlerden herhangi biri patlarsa inşa sürecini durdurur. Eğer testler geçmezse bile inşa işleminin devam etmesini istiyorsanız bunu testFailureIgnore öğesini true yaparak ayarlayabilirsiniz: org.apache.maven.plugins maven-surefire-plugin true ...

Testlerin atlanmasını(çalıştırılmamasını) istiyorsanız komut satırından şu sistem değişkenini girerek bunu sağlayabilirsiniz: -Dmaven.test.skip=true

Bu komut Maven’ın Compiler ve Surfire eklentileri de olmak üzere bütün evrelerini etkiler.

3.5.6.INSTALL(YÜKLE) install eklentisinin install:install evresi projenin çıktısını (JAR,POM,EAR,WAR…) paket yapısına uygun olarak yerel deponuza kopyalar. Eğer groupId=org.sonatype.mavenbook, artifactId=simple-test ve sürüm=1.0.2, olan bir projeniz varsa install:install komutu oluşan JAR dosyasını target/simple-test1.0.2.jar adresinden ~/.m2/repository/org/sonatype/mavenbook/simple-test/1.0.2/simple-test-1.0.2.jar adresine kopyalayacaktır.

3.5.7.DEPLOY(YAYINLA) Deploy yaşam döngüsünde projeniz uzak Maven sunucularına yüklenir. Uzak sunucuya erişim bilgileri ~/.m2/settings.xml dosyasında saklanır. Bu yaşam döngüsü Deploy eklentisinin deploy hedefi ile tetiklenir: deploy:deploy

21 4.1.Maven’ı Çalıştırmak

4.MAVEN KOMUT SATIRI Şimdiye kadar hep Maven’ın özelliklerinden bahsettik ama hiç Maven’ı çalıştırmadık. Bu bölümde detaylarıyla Maven’ın komut satırından (command prompt, terminal…) nasıl kullanılacağını irdeliyoruz.

4.1.MAVEN’I ÇALIŞTIRMAK Maven’ın çalıştırılabilir dosyası mvn ’dır. Sisteminize doğru bir şekilde kurulup kurulmadığını anlamanız için mvn –v komutunu çalıştırın. Eğer komut satırına buna benzer bir çıktı düşerse doğru yoldasınız demektir: C:\Documents and Settings\Foobar\Desktop>mvn -v Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100) Maven home: D:\apache-maven-3.0.3 Java version: 1.6.0_24, vendor: Sun Microsystems Inc. Java home: C:\Program Files\Java\jdk1.6.0_24\jre Default locale: tr_TR, platform encoding: Cp1254 OS name: "windows xp", version: "5.1", arch: "x86", family: "windows"

4.1.1.SİSTEM DEĞİŞKENİ(PROPERTY) TANIMLAMAK Komut satırından Maven’a bir sistem değişkeni aktarmak için –D ya da –define parametrelerini kullanabilirsiniz. Örneğin; $ mvn help:describe -Dcmd=compiler:compile $ mvn install -Dmaven.test.skip=true

Bu şekilde komut satırından tanımlanan sistem değişkenlerine POM dosyasından erişebilirsiniz. Aslında komut satırından java aracını daha önce çalıştırmışlara bu parametre çok da yabancı olmasa gerek. Çünkü aynısı bu araçta da var.

4.1.2.YARDIMI GÖRÜNTÜLEMEK Komut satırı yardımını -h ya da --help parametreleri ile görüntüleyebilirsiniz. Bunun dışında yaşam döngüsü evreleri ve hedefleri hakkında bilgi veren bir eklenti de bulunmakta. Bu eklentiyi daha sonra inceleyeceğiz.

4.1.3.İNŞA PROFİLLERİNİ ETKİNLEŞTİRMEK Herhangi bir profili etkinleştirmek için –P veya --activate-profiles parametrelerinin ardından profil ismini girebilirsiniz.

4.1.4.SÜRÜM BİLGİSİNİ GÖRÜNTÜLEMEK Maven’ın sürüm bilgisini görüntülemek için -v ya da -V parametrelerini kullanabilirsiniz. -v sürüm bilgisini görüntüleyip maven’ın çalışmasını durdururken, -V maven’ın çalışmaya devam etmesine fırsat verir.

22 4.2.Maven Yardım(Help) Eklentisi

4.1.5.ÇEVRİMDIŞI KİPTE ÇALIŞTIRMAK Maven’ı çevrimdışı kipte çalıştırmak için -o ya da --offline parametrelerini kullanabilirsiniz. Maven bu kipte çalışırken İnternete bağlanmaya çalışmayacak, projenizin bağımlıklıarın indiremeyecektir.

4.1.6.ALTERNATİF POM VEYA AYAR DOSYASI KULLANMAK Projenizde ön tanımlı ayarların dışında kendi belirteceğiniz bir POM veya settings.xml kullanmak istiyorsanız; Alternatif POM için: -f veya --file Alternatif settings.xml için: -s veya --settings Alternatif global settings.xml için: -gs veya --global-settings

komutlarını kullanabilirsiniz.

4.1.7.PROJE HATA VERİRSE YAPILACAKLAR Çok modüllü projelerde, projelerden herhangi birinin hata vermesi durumunda; Hata veren modülün inşasının durması diğerlerinin devam etmesini istiyorsanız: -fae veya -fail-at-end Hiçbir modülün inşasının durmasını istemiyorsanız: -fn veya --fail-never

4.1.8.GÜNLÜKLEME SEVİYESİ Aşağıdaki parametreler Maven’ın günleme seviyelerini kontrol eder: Hata Mesajları: -e veya --errors Hata Ayıklama Mesajları: -X veya --debug Sessiz Kip (sadece hata mesajları): -q veya --quiet

4.1.9.ETKİLEŞİMSİZ KİP(BATCH MODE) Bu kipte Maven kullanıcıdan bilgi girmesini istemek için durmaz gerekli bilgileri ön tanımlı olarak kendi sağlar: -B veya --batch-mode

4.1.10.EKLENTİ GÜNCELLEMELERİNİ YÖNETMEK Eklenti güncellemesi yapma: -npu veya --no-plugin-updates Eklenti güncellemesi yap. POM’unuzda sürüm numaralarını belirttiğiniz eklentileri etkilemez: -cpu veya --check-plugin-updates veya -up veya --update-plugins Bu komut maven’ın eklentileri internetten indirme biçimini etkiler. Plugin Registry kullanılmaz: -npr veya --no-plugin-registry

4.1.11.ALT MODÜLLERİ İNŞA ETMEYİ DURDURMA Maven’ın sadece komutun çalıştırıldığı dizindeki projeyi inşa etmesini alt modülleri inşa etmemesini istiyorsanız: -N veya --non-recursive

4.2.MAVEN YARDIM(HELP) EKLENTİSİ Yardım eklentisi, Maven komutları, eklentileri ve projenin durumu hakkında bilgiler verir. Bu eklenti sayesinde herhangi bir eklentinin evreleri, bu evrelere bağlı hedefler, etkin profiller, etkin POM, etkin ayarlar… v.b. bilgilere ulaşabilirsiniz.

23 4.2.Maven Yardım(Help) Eklentisi Yardım eklentisinin 4 tane hedefi vardır: İlk üçü (active-profiles, effective-pom, effective settings) geçerli proje hakkında bilgiler sağlar. 4. hedef ise(describe) eklentiler ve hedefleri hakkında bilgile verir. help:active-profiles - Etkin profilleri listeler */ help:effective-pom - Etkin POM’u listeler */ help:effective-settings - Toplam ayarları listeler. Globali, yerel, POM…*/ help:describe - Bir eklentinin özelliklerini listeler.*/

4.2.1.EKLENTİLER HAKKINDA BİLGİ ALMAK Maven’ı kullanmaya yeni başladıysanız, birçok kez eklentilerin nasıl çalıştığı, ayarları, evre ve hedefleri… v.s. hakkında bilgiye ihtiyacınız olacaktır. Bunun için Yardım eklentisinin help:describe hedefini kullanabilirsiniz. Yardım eklentisi, eklenti parametresiyle birlikte adını veya koordinatlarını (gropId:artifactId) verdiğiniz eklenti hakkında açıklamalar verir. C:\>mvn help:describe -Dplugin=help [INFO] Scanning for projects... [INFO] [INFO] -----------------------------------------------------------------------[INFO] Building Maven Stub Project (No POM) 1 [INFO] -----------------------------------------------------------------------[INFO] [INFO] --- maven-help-plugin:2.1.1:describe (default-cli) @ standalone-pom --[INFO] org.apache.maven.plugins:maven-help-plugin:2.1.1

Name: Maven Help Plugin Description: The Maven Help plugin provides goals aimed at helping to make sense out of the build environment. It includes the ability to view the effective POM and settings files, after inheritance and active profiles have been applied, as well as a describe a particular plugin goal to give usage information. Group Id: org.apache.maven.plugins Artifact Id: maven-help-plugin Version: 2.1.1 Goal Prefix: help This plugin has 9 goals: help:active-profiles Description: Displays a list of the profiles which are currently active for this build. help:all-profiles Description: Displays a list of available profiles under the current project. Note: it will list all profiles for a project. If a profile comes up with a status inactive then there might be a need to set profile activation switches/propert. ………………………………………………

Yukarıdaki komut satırına full parametresini ekleyerek daha ayrıntılı bilgi görüntülenmesini sağlayabilirsiz. $ mvn help:describe -Dplugin=help -Dfull

24 4.2.Maven Yardım(Help) Eklentisi Ya da detail parametresi: mvn help:describe -Dcmd=compiler:compile -Ddetail

Eğer sadece belli bir hedef hakkında bilgi alamak istiyorsanız mojo parametresinden sonra hedefin ismini yazabilirsiniz: $ mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull

25 5.1.Eklentilerin Bağımlıkları

5.EKLENTİ AYARLARI Maven’da eklenti ayarları POM dosyasında plugin öğesi altına çeşitli bilgiler girerek yapılır. Elentilerin içerdiği her hedefin çeşitli ayar parametreleri vardır. Örneğin Derleme eklentisi; source, target, compilerArgument, fork, optimize… v.s. parametrelerini barındırır. Eklentiler, evreleri, hedefleri ve bunların parametreleri hakkında bilgi almak için Yardım eklentisini kullanabilirsiniz.

5.1.EKLENTİLERİN BAĞIMLIKLARI Eğer projenizde kullandığınız eklentinin bir bağımlılığının belli bir sürümüne ihtiyaç duyuyorsanız, bu bağımlılığı POM’da eklenti öğresinin altında belirtebilirsiniz: com.agilejava.docbkx docbkx-maven-plugin 2.0.9 docbook docbook-xml 4.5 org.apache.fop fop-pdf-images 1.3 org.apache.fop fop-pdf-images-res 1.3 res pdfbox pdfbox 0.7.4-dev dev

Bu POM parçası belirtilen eklentinin ön tanımlı ayarlarını override eder.

5.2.EKLENTİ PARAMETRELERİNİ POM’DA BELİRTMEK Herhangi bir eklentinin ayarlarını değiştirmek için şu POM parçasını örnek olarak kullanabilirsiniz: org.apache.maven.plugins maven-compiler-plugin 1.5 1.5

26 5.3.Çalıştırılan Hedeflere Özel Ayarlar

5.3.ÇALIŞTIRILAN HEDEFLERE Ö ZEL AYARLAR Eklentilere belirli hedeflerin çalıştırılması sırasında geçerli olmak üzere özel ayarlar atayabilirsiniz. Örneğin aşağıdaki XML, AntRun eklentisinin validate evresinin run hedefi için bazı ayar parametreleri aktarır. Buna göre hedef işletilirken geçerli olacak olan ayarlar, eklentinin ön tanımlı ayarlarıyla burada belirtilen ayarların birleştirilmesiyle son halini alır. maven-antrun-plugin validate run ${PATH}=${env.PATH} User's Home Directory: ${user.home} Project's Base Director: ${basedir}

5.4.KOMUT SATIRI PARAMETRELERİNİ POM’DAN AYARLAMAK Maven’da komut satırından girmeniz gereken parametreleri POM içinden de atayabilirsiniz. Bunun için önceki örneğe benzer bir yol izleyeceğiz, ancak bu sefer execution öğesinin id elemanına özel olarak default-cli değerini atayacağız. maven-assembly-plugin false assemble-binary package single src/main/assembly/bin.xml default-cli jar-with-dependencies

27 6.1.Birliktelik Tarifleri(Assembly Descriptors)

6.BİRLEŞTİRME(ASSEMBLY)EKLENTİSİ Projeniz son halini aldıktan sonra bütün kaynakları(resource, kaynak kodu, belgeleri, sisteme özel yerel referansları, bağımlıkları), ayarları(properties dosyaları, XML, ) v.s. ile birlikte tek bir paket veya dizin altında toplamak isteyebilirsiniz. İşte bu paketlere Maven Birlikteliği(Assembly) denir. Birliktelikler genelde projelerin paket yapısı ön tanımlı paket yapılarıyla uymadığında(JAR,EAR,WAR) kullanılır. Birleştirme eklentisinin iki ana hedefi vardır: Bunlardan assembly:assembly bir araya getiricidir. Projeniz kaç modüllü olursa olsun bir inşa yaşam döngüsü içinde sadece bir kere komut satırından çalıştırılmak üzere tasarlanmıştır. Projenin birleştirilip son halini almakta kullanıldığı için genelde ebeveyn modülden çalıştırılır. Ve belirtilen ayarlara göre inşa yaşam döngüsünün package evresini çalıştırabilir (paketleme işlemini yapmak için). Bahsedeceğim ikinci önemli hedef ise assembly:single. Bu hedef projenizin modülleri içinde POM’da belirtilip birleştirme işlemleri kapsamında her bir modül için ayrı ayrı çalıştırılmak üzere tasarlanmıştır. assembly:assembly nin tersine package evresini çalıştırmaz. İkisinin kullanımında dikkat etmeniz gereken özellikler: assembly:assembly sadece komut satırından, single ise POM içinden bağlandığı inşa yaşam öngüsü evresine sıra gelince çalştırılmalıdır.

6.1.BİRLİKTELİK TARİFLERİ(ASSEMBLY DESCRİPTORS ) Proje dosyalarının nasıl bir araya getirileceğini tarif eden dosyalara birliktelik tarifi (assembly descriptor) denir. Eğer projenizin dizin yapısı size özelse kendi tariflerinizi yazmanız ve birliktelik eklentisini çalıştırırken bu tarifi belirtmeniz gerekir ki eklenti dosyaları nasıl bir araya getireceğini bilsin. 4 tane ön tanımlı birlikteik tarifi vardır: 1. bin: Projenin çıktısının bir JAR arşivi olacağını varsayar ve son haline LICENSE, README, ve NOTICE dosyaları ekler. 2. jar-with-dependencies: Projeyi inşa edip bir JAR arşivi çıktısı verir. Ayrıca arşive çalışma zamanı bağımlıklarını da katar. Bunun yanında bir Main-Class girdisi belirtip arşivin çalıştırılabilir olmasını sağlayabilirsiniz. Bu birliktelik tarifi, projenizi ihtiyaç duyduğu bütün bağımlıkları ile bir JAR dosyası halinde dağıtmak için biçilmiş kaftandır. 3. project: Projenin dizin yapısını target dizini haricinde olduğu gibi arşivler. 4. src: Projenizin kaynak dizini, pom.xml dosyası, LICENSE, README, ve NOTICE dosyalarını paketler.

6.2.ÖRNEK BİR BİRLİKTELİK İNŞASI Örneğin projenizi dağıtırken kaynak kodunu da dahil etmek istediniz. Bunun için tek yapmanız gereken şu komutu çalıştırmak: $ mvn -DdescriptorId=project assembly:single ... [INFO] [assembly:single] [INFO] Building tar : /Users/~/mvn-examples-1.0/assemblies/direct-invocation/\ target/direct-invocation-1.0-SNAPSHOT-project.tar.gz [INFO] Building tar : /Users/~/mvn-examples-1.0/assemblies/direct-invocation/\ target/direct-invocation-1.0-SNAPSHOT-project.tar.bz2 [INFO] Building zip: /Users/~/mvn-examples-1.0/assemblies/direct-invocation/\ target/direct-invocation-1.0-SNAPSHOT-project.zip ...

28 6.3.Dahası Çok sık karşılaşılan bir durum da şudur: Birkaç bağımlılığı olan bir projenizi (çalıştırılabilir de olabilir) tek bir JAR paketi olarak dağıtmak isteyebilirsiniz. Kendiniz yapsanız komut satırıyla boğuşmanızı gerektirecek bu işlemi Maven ile rahatlıkla halledebilrsiniz. Bunun için şu POM parçasını kullanabilirsiniz: maven-assembly-plugin 2.2-beta-2 create-executable-jar package single jar-with-dependencies org.sonatype.mavenbook.App

Burada Birliktelik eklentisinin ayarlarını yapıyoruz. İnşa yaşam döngüsünün package evresine single hedefini atadığımıza dikkat edin. Çalıştırılabilir arşivin ana sınıfını org.sonatype.navenbook.App olarak belirtiyoruz. Son olarak da jar-with-dependencies birliktelik tarifini kullanıyoruz. Yalnız önceki örnekte komut satırından descriptorId parametresi girmiştik, ancak burada descriptorRefs öğesini kullanıyoruz. Bunun nedeni bu öğe altında birden fazla descriptorRef tanımlayıp böylece ileride proje çıktısı olarak yine birden fazla birliktelik alabilmemize olanak tanımak. Bundan sonra tek yapmanız gereken komut satırından mvn package komutunu çalıştırmak. target/ dizini altında executable-jar-1.0-SNAPSHOT-jar-with-dependencies.jar dosyası oluşturulacaktır.

6.3.DAHASI Ç.N:Buraya kadar anlattığım kısım birliktelik eklentisinin en temel özelikleriydi. Eğer bu 4 ön tanımlı biriktelik tarifi isteklerinizi karşılamıyorsa kendi tarifinizi de yazabilirsiniz. Ancak bu işlem daha çok ileri seviye Maven kullanıcılarına hitap ediyor. Ben birlitelik eklentisi hakkında kafanızda bir fikir oluşması için anlattığım bu bölümü burada bitiriyorum. İlerisi için kitabı İngilizce orjinaline bakabilirsiniz.

29 7.1.Örnek Proje

7. PROJE İSKELETLERİ(ARCHETYPE) Maven, proje oluştururken kullanabiliceğiniz onlarca proje iskeleti barındırır. Bu proje iskeletleri piyasada kullanılan proje tiplerine göre standart dizin yapısı, gerekli bağımlılıkların önceden projeye eklenmesi, inşa ayarlarının bunlara göre yapılmış olması, ayar dosyalarının (log4j.properties, web.xml, application-context.xml… v.b.)oluşturulması gibi işlemleri projenin başlangıcında hazır olarak sağlar. Maven Archetype eklentisi belirtilen iskelete göre proje yapısını oluşturmaktan sorumludur.

7.1.ÖRNEK PROJE Proje iskeletlerini kullanıp Archetype eklentisi ile komut satırından etkileşimli bir biçimde proje oluşturmak için: Sisteminizde yeni bir dizin oluşturun ve bu dizin içinde komut satırından mvn archetype:generate komutunu çalıştırın. Maven önceden deposunda tanımlı 385 tane proje iskeletini listeleyecek ve varsayılan olarak da 104 numaralı maven-archetype-quickstart iskeletini seçecektir. Bu 385 iskeletten proje yapınıza uygun olanını seçin. C:\>mvn archetype:generate [INFO] Scanning for projects... [INFO] [INFO] -----------------------------------------------------------------------[INFO] Building Maven Stub Project (No POM) 1 [INFO] -----------------------------------------------------------------------[INFO] [INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom --[INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) Choose archetype: 1: remote -> docbkx-quickstart-archetype (-) 2: remote -> multi (-) 3: remote -> simple (-) ......... 102: remote -> maven-archetype-portlet (An archetype which contains a sample JSR268 Portlet.) 103: remote -> maven-archetype-profiles (-) 104: remote -> maven-archetype-quickstart (An archetype which contains a sample Maven project.) .......... 384: remote -> circumflex-archetype (-) 385: remote -> javg-minimal-archetype (-) Choose a number: 104:

Ben burada 104 numaralı iskelet ile devam edeceğim. İskeleti seçikten sonra Archetype eklentisi internetten iskeleti indirecek ve sırasıyla projeniz için şu bilgileri girmenizi isteyecek: groupId, artifactId, version, package

30 7.2.Bazı Önemli Proje İskeletleri Define value for groupId: : org.sonatype.mavenbook Define value for artifactId: : quickstart Define value for version: 1.0-SNAPSHOT: : 1.0-SNAPSHOT Define value for package: org.sonatype.mavenbook: : org.sonatype.mavenbook Confirm properties configuration: groupId: org.sonatype.mavenbook artifactId: quickstart version: 1.0-SNAPSHOT package: org.sonatype.mavenbook Y: : Y

Bu bilgileri girdikten sonra maven girdiğiniz artifactId ile aynı isimde bir dizin oluşturup, içine proje dosyalarını (pom.xml, src, test… v.s.) koyacaktır. [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO] [INFO]

Parameter: groupId, Value: org.sonatype.mavenbook Parameter: packageName, Value: org.sonatype.mavenbook Parameter: basedir, Value: /Users/tobrien/tmp Parameter: package, Value: org.sonatype.mavenbook Parameter: version, Value: 1.0-SNAPSHOT Parameter: artifactId, Value: quickstart ********************* End of debug info from resources from \ generated POM ** OldArchetype created in dir: /Users/tobrien/tmp/quickstart -----------------------------------------------------------------------BUILD SUCCESSFUL -----------------------------------------------------------------------Total time: 1 minute 57 seconds Finished at: Sun Oct 12 15:39:14 CDT 2008 Final Memory: 8M/15M ------------------------------------------------------------------------

7.2.BAZI ÖNEMLİ PROJE İSKELETLERİ maven-archetype-quickstart: Maven için tanımlanmış en basit proje iskeletidir. Çıktı olarak JAR paketi oluşturur ve sadece test amaçlı Junit bağımlılığı vardır. App adında bir “Merhaba Dünya” programı ve bunun AppTest adında bir testini oluşturur. maven-archetype-webapp: Çıktı olarak bir WAR paketi veren ve bağımlılık olarak sadece JUnit’i belirten basit bir proje iskeletidir. ${Ana-Dizin}/src/main/webapp altında bir index.jsp bir de web.xml dosyası oluşturur. maven-archetype-mojo: Maven eklentilerinin bir diğer adı da mojo’dur. Bu iskelet paketleme tipi maven-plugin olan ve MyMojo adında bir mojo sınıfı içeren bir proje oluşturur. MyMojo sınıfı process-resources evresinde çalışan touch adında bir hedef tanımlar. Bu hedef çalıştırıldığında target/ klasöründe touch.txt dosyasını oluşturur. mavenplugin-api ve JUnit bağımlılıklarını tanımlar.

31 Son Söz (Şimdilik :)

SON SÖZ (ŞİMDİLİK :)

MAVEN-REHBER.pdf

Retrying... Download. Connect more apps... Try one of the apps below to open or edit this item. MAVEN-REHBER.pdf. MAVEN-REHBER.pdf. Open. Extract.

1MB Sizes 22 Downloads 193 Views

Recommend Documents

No documents