4. Ajanda
• Maven ... • Archetype Yapısı
• Temel Kavramlar Proje Şablonları
- POM
- Kurulum Yaşam Döngüsü
• IDE Desteği
(Build Life Cycle) • MOJO’nuzu arttırmanın
yolları...
- Bağımlılıkların Yönetimi
(Dependency Mng.)
- Ambarlar
(Repositories)
- Eklentiler
(Plugins)
5. Maven..
• ASF’den bir proje yönetim uygulama çatısı
• Ortak bir kurulum sistemi
• Kurulumu olabildiğince kolay hale getirmek
• Yazılım Projeleri için detaylı bir model sunuyor...
• Sürümler:
1.x
2.x ( 2.0.x, 2.2.x (jdk1.5) )
3.x
2.x proje ve eklentileri hala destekleniyor.
Çoğu bölüm yeni baştan yazıldı.
new dependency resolving algorithm / resolution system
Better IDE support
6. Temel Özellikler
• Minimum Konfigurasyon
(Convention over Configuration)
• Ortak Arayüzler
Kurulum mühendislerinin zamanı sona erdi...
Kurulumla uğraşmayı bırak, geliştirmeye başla..!
• Bağımlılıkların Yönetimi
Public repositories
• Eklenti tabanlı Mimari
• Dökümantasyon
Rapor (kod gözden geçirme), Site üretimi ...
7. POM (Project Object Model)
• Projenizi bir Maven projesi yapan şey...
• Bir XML dosyası
• Sadece projenin kurulumu için değil....
proje ilişkileri,
proje takım üyeleri,
lisans,
SCM...
• Sadece Java Projeleri için değil
Groovy,
(Polyglot)
Scala,
JRuby,
FLEX,
Microsoft C#
10. En Basit POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.gelecex.gazi2011</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
</project>
}
kodu derle
testleri çalıştır
$ mvn install jar olarak paketle
yerel repo’ya deploy et
11. 6 satır XML ile bu nasıl mümkün
oluyor?
Dizin tanımları (Kaynak dosya
dizini) diğer tüm tanımlar nerede
yapılıyor?
12. Süper POM
• java.lang.Object ile aynı analoji
• ${M2_HOME}/lib/ maven-2.2.1-uber.jar!
/org/apache/maven/project/pom-4.0.0.xml
• Standart dizin yapısı
• Ortak plugin’lerin versiyonları sabitlendi >= 2.0.9
• Repo tanımı: http://repo1.maven.org/maven2
• Birleştirilmiş POM’u görmek için:
$ mvn help:effective-pom
13. Kurulum Yaşam Döngüsü
Build LifeCycle
• Proje çıktısını oluşturmak ve dağıtmak için yapılan
işlem açık bir şekilde belirtilmiştir.
• 3 hali hazırda Yaşam Döngüsü bulunuyor
default: proje kurulumu (project deployment)
clean: kurulum tarafından oluşturulan proje
dosyalarının temizlenmesi
site: projenin site dökümanlarının üretilmesi
• Yaşam döngüsü belli sıradaki fazlardan oluşur (phase)
• 0 ya da daha fazla "goal her faz ile ilişkilidir
14. validate
default
compile
test
package
integration-test
verify
install
deploy
18. $ mvn dependency:analyze
Kullanılmayan ama tanımlanmış bağımlılıklar
[WARNING] Unused declared dependencies found:
[WARNING] com.gelecex.gazi2011:projectB:jar:1.0:compile
[WARNING] com.gelecex.gazi2011:projectC:jar:1.0:compile
Kullanılmak istenenen ama tanımlanmamış bağımlılıklar
[WARNING] Used undeclared dependencies found:
[WARNING] opensymphony:xwork:jar:2.0.0:compile
19. Bağımlıkların Kapsamı
(Scope for Dependencies)
CTR compile
provided CT
TR runtime
test T
CT system
import ---
CTR
Classpaths
Compile Test Runtime
20. Versiyonlama ve Sınırları
(Versioning and Ranges)
<major>.<minor>.<incremental> - <qualifier>
1.2.3 / 1.2.3-alpha-01
string karşılaştırmasına dikkat, niteleyici (qualifier) bölümü için
1.2.3-alpha-2 > 1.2.3-alpha-10
(, ) - Exclusive
[, ] - Inclusive <version>[3.8,4.0)</version>
21. SNAPSHOT Niteleyicisi
• Aktif geliştirilen sürüm : 1.0.0-SNAPSHOT
• Uzak Repo’dan:
myjar-1.0.0-SNAPSHOT.jar
uygulanan kalıp: date . time - build#
sonuç => myjar-1.0.0-20100219.141012-1.jar
yerel repo’ya kurulum
1.0.0-SNAPSHOT ==> 1.0.0-SNAPSHOT
•
23. <scope>compile</scope>
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
commons-logging
commons-logging
1.1.1
Bağımlılık Çizgesi
24. Maven hangi B yi seçecek?
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
commons-logging
commons-logging
1.1.1
B : 2.0 ?
En yüksek değer?
25. En Yakın Olan
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
commons-logging
commons-logging
1.1.1
26. Hangi commons-logging?
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
? ? ?
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
?
commons-logging
commons-logging
1.1.1
27. Aynı uzaklıkta İlk sıradaki...
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
commons-logging
commons-logging
1.1.1
28. A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging
commons-logging
1.0.4
Bağımlılık Çizgesi
29. Proje A çalışacak mı?
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging
commons-logging
1.0.4
30. A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging
commons-logging
1.0.4
31. <dependencyManagement /> kullan..!
A : A : 1.0
D : D : 1.0 C : C : 1.0 B : B : 1.0
commons-logging commons-logging commons-logging
commons-logging
B : B : 2.0 commons-logging commons-logging
1.0.4 1.1.1 1.0.1
commons-logging
commons-logging
1.1.1
Bağımlılık Çizgesi
40. Ambarlar (Repositories)
• Kurulumun ihtiyaç duyduğu bağımlılıkları ve
kurulum çıktılarını yönetmek için
• yerel (local) or uzak (remote) repo’lar
• jar, war, ear, ejb, rar depolayabilirsiniz.
• Maven, tanımlanmadıysa 2 repo ya bakar
- yerel repo
- http://repo1.maven.org/maven2 /uber-pom/
• Release & Snapshot repo’ları
43. Eklentiler
• Eklenti Tabanlı Mimari
kodu derlemek için bile bir plugin..
• Bir Maven Projesi..tanımlayıcı plugin.xml dosyası ve
bir veya daha fazla MOJO içeriyor.
• IoC olarak Plexus
neden Spring değil?
• Pluginlerin yönetildiği 2 proje var:
org.apache.maven.plugins / central repo
org.codehaus.mojo / codehaus repo
44. Maven Eklentileri
Packaging Integration
jar war ear ejb
Core rar pom shade Eclipse
clean IDEA
compiler
deploy
failsafe
install Maven Tools Ant
resources Reporting
Repo Antlr
site Antrun
Changelog
surefire Archetype
Changes
verifier Assembly
Checkstyle
Clover Others Cargo Help
Javadocs jaxme Release
PMD jetty
Surefire-reports tomcat
45. Şablon Projeler (Archetypes)
• Maven proje şablonları
• Tanımlayıcı XML dosyaları + velocity şablonları
• Maven Projesi yaratmak için:
mvn archetype:generate
-DgroupId=com.gelecex.gazi2011
-DartifactId=archetype-quickstart
-Dversion=1.0-SNAPSHOT
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.0
46. Şablon Proje Kataloğu
• Archetype paylaşımı için bir katalog XML dosyası
<?xml version="1.0" encoding="UTF-8"?>
<archetype-catalog>
<archetypes>
....
<archetype>
<groupId>org.jboss.weld.archetypes</groupId>
<artifactId>weld-jsf-servlet-minimal</artifactId>
<version>1.0.0-BETA1</version>
<description>....</description>
</archetype>
.....
</archetypes>
</archetype-catalog>
• $ mvn archetype:generate -DarchetypeCatalog=http://
anonsvn.jboss.org/repos/weld/archetypes/tags/1.0.0-
BETA1
47. Projeden Archetype üretimi
• Varolan bir projeyi archetype’a kaynak olarak
kullanarak şablon projenin yaratılması.
$ mvn archetype:create-from-project
• üretilen archetype :
target / generated-sources / archetype
dizini altında bulunacaktır.
48. IDE Desteği
• Eclipse Helios
m2eclipse (sonatype)
Eclipse IAM (formerly Q4E)
maven-eclipse-plugin @ central-repo
• NetBeans 6.9.1
birlikte geliyor... embedded maven
• Intellij IDEA 10
birlikte geliyor... embedded maven
maven-idea-plugin @ central-repo
52. Özellik Referansları
(Property References)
env.*
İşletim sistemi ve Shell tarafından sunulan değişkenlerin kullanımı
${env.JAVA_HOME}
project.*
POM elemanları
${project.groupId} ${project.parent.groupId}
settings.*
Maven settings.xml dosyası özellikleri
${settings.localRepository}
<properties>
<foo>bar</foo>
</properties>
53. İyi Pratikler
• Sıfırdan başlıyorsanız MAVEN ile başlayın..!
• Ambar Yöneticisi (Repository Manager) kullanın.
Şirket Reponuzu kurun...
• Şirkete Özel POM... POM’u
basit
taşınabilir (harcoding’den kaçının)
olmasını sağlayın
• Profilleri kullanın...
• Projelerde <dependencyManagement /> kullanın
54. İyi Pratikler
• Öyle bir ayarlayın ki...
Erken ve Sık Yayımlayın
- Kolay, Hızlı ve tekrar üretilebilen yayımlar..
- Sürekli Entegrasyon araçları ile entegrasyon..
• Her proje kendi artifact’ini üretmeli (SoC)
• IDE desteğini kullanın
taş devrinden, maden devrine...
• Testleriniz atlattırmayın...!
-Dmaven.test.skip=true
-Dmaven.test.failure.ignore=true
55. Kaynaklar...
http://www.sonatype.com/book
Maven: The Complete Reference
Maven By Example
m2eclipse Book
Nexus Book
http://www.maestrodev.com/better-build-maven
Better Builds with Maven