SlideShare a Scribd company logo
1 of 57
Maven
       ile
Akıllı Projeler
   Mert ÇALIŞKAN
      Gazi Üniversitesi
          01.2011
Ben...
•   Mert ÇALIŞKAN

    •   Yazılımcı !
           STM A.Ş.



•   Açık Kaynak Kodlu Yazılım Savunucusu

    •   Apache Software Foundation

    •   OpenLogic Expert Community
Siz?

         +




Gradle
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)
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
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 ...
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#
POM
http://tinyurl.com/maven-xsddoc
POM
<project ...>
    <parent />
    <groupId /> <artifactId /> <version />
    <packaging />
    <developers /> <contributors />
    <scm>... </scm>
    <build>
      <plugins>....</plugins>
    </build>
    <dependencies>....</dependencies>
    <repositories>....</repositories>
    <pluginRepositories>... </pluginRepositories>
    <profiles>...</profiles>
    <reporting>... </reporting>
</project>
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
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?
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
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
validate
                     default
           compile

                       test

                               package

                                         integration-test

                                verify

                     install

           deploy
default
    validate
                              mvn <phase>
    compile                mvn <phase:goal>
                       mvn <phase> <phase:goal>
      test          mvn <phase:goal> <phase:goal>

    package
                       $ mvn integration-test
integration-test                   validate

     verify                       compile


     install                         test


    deploy                        package

                               integration-test
Bağımlılık Yönetimi
•   Koordinatları belirle ! (GAV faktörü)

        <dependency>
          <groupId>benimsirketim</groupId>
          <artifactId>superprojem</artifactId>
          <version>1.0</version>
          <scope>compile</scope>
        </dependency>



•   Geçişli Bağımlılıklar
      İstediğin bağımlılıklar ve onların bağımlı oldukları...
      İstemediğin bağımlılıkları hariç tut..
$ mvn dependency:tree
 [INFO] net:eniyiyemek:war:1.0-SNAPSHOT
 [INFO] +- org.jboss.seam:jboss-seam:jar:2.2.0.GA:compile
 [INFO] | +- xstream:xstream:jar:1.1.3:compile
 [INFO] | +- xpp3:xpp3_min:jar:1.1.3.4.O:compile
 [INFO] | - org.jboss.el:jboss-el:jar:1.0_02.CR4:compile
 [INFO] +- org.jboss.seam:jboss-seam-ui:jar:2.2.0.GA:compile
 [INFO] | +- org.jboss.seam:jboss-seam:ejb:2.2.0.GA:compile
 [INFO] | +- org.jboss.seam:jboss-seam-jul:jar:2.2.0.GA:compile
 [INFO] | - commons-beanutils:commons-beanutils:jar:1.7.0:compile
 [INFO] +- org.jboss.seam:jboss-seam-mail:jar:2.2.0.GA:compile
 [INFO] +- javax.mail:mail:jar:1.4.1:compile
 [INFO] | - javax.activation:activation:jar:1.1:compile
 [INFO] +- quartz:quartz:jar:1.6.0:compile
 [INFO] +- commons-logging:commons-logging:jar:1.1.1:compile
 [INFO] +- javax.faces:jsf-api:jar:1.2_13:compile
 [INFO] +- javax.faces:jsf-impl:jar:1.2_13:compile
 [INFO] +- com.sun.facelets:jsf-facelets:jar:1.1.14:compile
 [INFO] +- jstl:jstl:jar:1.2:compile
 [INFO] +- org.primefaces:primefaces-stable:jar:1.0.0:compile
 [INFO] +- javax.transaction:jta:jar:1.1:compile
 [INFO] +- org.hibernate:hibernate-core:jar:3.5.0-Beta-2:compile
 [INFO] | +- antlr:antlr:jar:2.7.6:compile
 [INFO] | +- dom4j:dom4j:jar:1.6.1:compile
 [INFO] | - org.slf4j:slf4j-api:jar:1.5.8:compile
 [INFO] +- org.hibernate:hibernate-annotations:jar:3.5.0-Beta-2:compile
 [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Beta1:compile
 [INFO] | +- org.hibernate.java-persistence:jpa-api:jar:2.0-cr-1:compile
 [INFO] | - hsqldb:hsqldb:jar:1.8.0.2:compile
 [INFO] +- org.hibernate:hibernate-entitymanager:jar:3.5.0-Beta-2:compile
 [INFO] | - cglib:cglib:jar:2.2:compile
 [INFO] | - asm:asm:jar:3.1:compile
 [INFO] +- org.hibernate:hibernate-validator-legacy:jar:4.0.2.GA:compile
$ 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
Bağımlıkların Kapsamı
(Scope for Dependencies)
 CTR        compile
                             provided     CT
  TR        runtime
                               test       T
  CT        system
                             import       ---




CTR
                  Classpaths


  Compile             Test              Runtime
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>
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
•
Versiyon çözümlemesini
 Maven Nasıl Yapıyor?
<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
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?
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
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
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
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
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
A : A : 1.0




   D : D : 1.0    C : C : 1.0   B : B : 1.0




commons-logging
commons-logging
    1.0.4
<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
Bağımlılık / Proje
       Yönetimi


Inheritance


               Aggregation
Kalıtım

                   <project>
                     <modelVersion>4.0.0</modelVersion>
                     <parent>
parentapp              <groupId>com.gelecex.gazi2011</groupId>
                       <artifactId>ana_app</artifactId>
     <<extends>>       <version>1.0.0</version>
                     </parent>
                     <groupId>com.gelecex.gazi2011</groupId>
sampleapp
                     <artifactId>ornek_app</artifactId>
                     <version>1.0.0</version>
                   </project>
Kalıtım <dependencyManagement/>
                   <project>
                     <modelVersion>4.0.0</modelVersion>
                     <groupId>com.gelecex.gazi2011</groupId>
                     <artifactId>ana_app</artifactId>
                     <packaging>pom</packaging>
parentapp
                     <version>1.0</version>
                     <dependencyManagement>
     <<extends>>       <dependencies>
                   
     <dependency>
                   
      <groupId>commongs-logging</groupId>
sampleapp
                       
    <artifactId>commongs-logging</artifactId>
                   
      <version>1.1.1</version>
                          </dependency>
                       </dependencies>
                     </dependencyManagement>
                   </project>
Kalıtım <dependencyManagement/>

                   <project>
                     <modelVersion>4.0.0</modelVersion>
                   
   <parent>
                   
   
    <groupId>com.gelecex.gazi2011</groupId>
parentapp          
   
    <artifactId>ana_app</artifactId>
                   
   
    <version>1.0</version>
                   
   </parent>
     <<extends>>     <artifactId>ornek_app</artifactId>
                       <dependencies>
                   
     <dependency>
sampleapp
                   
       <groupId>commongs-logging</groupId>
                       
 <artifactId>commongs-logging</artifactId>
                         </dependency>
                       </dependencies>
                   </project>
                                           versiyon 1.1.1’i alacak
Modüler Yapı (Aggregation)

            <<depends>>                   <<depends>>
ProjectA                   ProjectB                      ProjectC




           root $ cd ProjectC




                                      }
           projectC $ mvn compile
           projectC $ cd ..
           root $ cd ProjectB
           projectB $ mvn compile          8 satır !!!
           projectB $ cd ..
           root $ cd ProjectA
           projectA $ mvn compile
POM
             modulesapp                    modulesapp:


<<module>>
                                           <project>
                              <<module>>
                                             <modelVersion>4.0.0</modelVersion>
                 <<module>>                  <groupId>com.gelecex.gazi2011</groupId>
                                             <artifactId>modul_app</artifactId>
ProjectA                      ProjectB       <packaging>pom</packaging>
                                             <version>1.0</version>
                                             <name>modul_app</name>
                                             <modules>
              ProjectC                         <module>projectA</module>
                                               <module>projectB</module>
                                            </modules>
root $ cd modulesapp                       </project>
modulesapp $ mvn compile
M2_REPO/javax/activation/activation/1.1/activation-1.1.jar
M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar


                                                                                         Ambar
M2_REPO/asm/asm/3.1/asm-3.1.jar
M2_REPO/cglib/cglib/2.2/cglib-2.2.jar
M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar
M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar
M2_REPO/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar
M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
                                                                                      (Repository)
M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar
M2_REPO/org/hibernate/hibernate-annotations/3.5.0-Beta-2/hibernate-annotations-3.5.0-Beta-2.jar
M2_REPO/org/hibernate/hibernate-commons-annotations/3.2.0.Beta1/hibernate-commons-annotations-3.2.0.Beta1.jar
M2_REPO/org/hibernate/hibernate-core/3.5.0-Beta-2/hibernate-core-3.5.0-Beta-2.jar
M2_REPO/org/hibernate/hibernate-entitymanager/3.5.0-Beta-2/hibernate-entitymanager-3.5.0-Beta-2.jar
M2_REPO/org/hibernate/hibernate-validator-legacy/4.0.2.GA/hibernate-validator-legacy-4.0.2.GA.jar
M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar
M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar
M2_REPO/org/jboss/el/jboss-el/1.0_02.CR4/jboss-el-1.0_02.CR4.jar
M2_REPO/org/jboss/seam/jboss-seam/2.2.0.GA/jboss-seam-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-jul/2.2.0.GA/jboss-seam-jul-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-mail/2.2.0.GA/jboss-seam-mail-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-ui/2.2.0.GA/jboss-seam-ui-2.2.0.GA.jar
M2_REPO/org/hibernate/java-persistence/jpa-api/2.0-cr-1/jpa-api-2.0-cr-1.jar
M2_REPO/javax/faces/jsf-api/1.2_13/jsf-api-1.2_13.jar
M2_REPO/com/sun/facelets/jsf-facelets/1.1.14/jsf-facelets-1.1.14.jar
M2_REPO/javax/faces/jsf-impl/1.2_13/jsf-impl-1.2_13.jar
                                                                                                     JSF
M2_REPO/jstl/jstl/1.2/jstl-1.2.jar
M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar
M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar
                                                                                                 PrimeFaces
M2_REPO/javax/mail/mail/1.4.1/mail-1.4.1.jar
M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar
M2_REPO/org/primefaces/primefaces-stable/1.0.0/primefaces-stable-1.0.0.jar
                                                                                                    Seam
M2_REPO/quartz/quartz/1.6.0/quartz-1.6.0.jar
M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar
M2_REPO/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar
                                                                                                     JPA
M2_REPO/org/slf4j/slf4j-nop/1.5.6/slf4j-nop-1.5.6.jar
M2_REPO/org/testng/testng/5.9/testng-5.9.jar
M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar
                                                                                                  Hibernate
M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar
M2_REPO/javax/activation/activation/1.1/activation-1.1.jar
M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar
M2_REPO/asm/asm/3.1/asm-3.1.jar
M2_REPO/cglib/cglib/2.2/cglib-2.2.jar
M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar
M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar
M2_REPO/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar
M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar
M2_REPO/org/hibernate/hibernate-annotations/3.5.0-Beta-2/hibernate-annotations-3.5.0-Beta-2.jar




                                         40
M2_REPO/org/hibernate/hibernate-commons-annotations/3.2.0.Beta1/hibernate-commons-annotations-3.2.0.Beta1.jar
M2_REPO/org/hibernate/hibernate-core/3.5.0-Beta-2/hibernate-core-3.5.0-Beta-2.jar
M2_REPO/org/hibernate/hibernate-entitymanager/3.5.0-Beta-2/hibernate-entitymanager-3.5.0-Beta-2.jar
M2_REPO/org/hibernate/hibernate-validator-legacy/4.0.2.GA/hibernate-validator-legacy-4.0.2.GA.jar
M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar
M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar
M2_REPO/org/jboss/el/jboss-el/1.0_02.CR4/jboss-el-1.0_02.CR4.jar
M2_REPO/org/jboss/seam/jboss-seam/2.2.0.GA/jboss-seam-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-jul/2.2.0.GA/jboss-seam-jul-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-mail/2.2.0.GA/jboss-seam-mail-2.2.0.GA.jar
M2_REPO/org/jboss/seam/jboss-seam-ui/2.2.0.GA/jboss-seam-ui-2.2.0.GA.jar
M2_REPO/org/hibernate/java-persistence/jpa-api/2.0-cr-1/jpa-api-2.0-cr-1.jar
M2_REPO/javax/faces/jsf-api/1.2_13/jsf-api-1.2_13.jar
M2_REPO/com/sun/facelets/jsf-facelets/1.1.14/jsf-facelets-1.1.14.jar
M2_REPO/javax/faces/jsf-impl/1.2_13/jsf-impl-1.2_13.jar
M2_REPO/jstl/jstl/1.2/jstl-1.2.jar
M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar
M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar
M2_REPO/javax/mail/mail/1.4.1/mail-1.4.1.jar
M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar
M2_REPO/org/primefaces/primefaces-stable/1.0.0/primefaces-stable-1.0.0.jar
M2_REPO/quartz/quartz/1.6.0/quartz-1.6.0.jar
M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar
M2_REPO/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar
M2_REPO/org/slf4j/slf4j-nop/1.5.6/slf4j-nop-1.5.6.jar
M2_REPO/org/testng/testng/5.9/testng-5.9.jar
M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar
M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar
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ı
Ambarlar (Repositories)
	   	   <repository>
	   	   	   <id>jboss-repo</id>
	   	   	   <name>The Release JBoss maven repo</name>
	   	   	   <url>http://repository.jboss.org/maven2</url>
	   	   	   <releases>
	   	   	   	   <enabled>true</enabled>
	   	   	   </releases>
	   	   </repository>

	   	   <repository>
	   	   	   <id>jboss-snapshot-repo</id>
	   	   	   <name>The Snapshot JBoss maven repo</name>
	   	   	   <url>http://snapshots.jboss.org/maven2</url>
	   	   	   <snapshots>
	   	   	   	   <enabled>true</enabled>
	   	   	   </snapshots>
	   	   </repository>
Bağımlılıkları bulmak için...

• http://repository.apache.org
• http://www.jarvana.com
• http://www.artifact-repository.org
• http://mvnrepository.com
• http://www.mvnbrowser.com
• http://mavensearch.net
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
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
Ş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
Ş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
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.
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
DEMO
 2 2
 DEMO
 dakikada   web uygulaması
MOJO’nuzu arttırmanın yolları...
mvn help:describe -Dplugin=<anygoal>

•    plugin’in goal’lerini ve tanımlarını listeler

mvn help:system

Sistem değişkenlerini ve
  ortam değişkenlerini listelemek için
Profilleri Kullanın
• Profiller yarat: development, staging & production
       <profile>
         <id>production</id>
         <build>
           <plugins>
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <configuration>
                  <debug>false</debug>
                  <optimize>true</optimize>
               </configuration>
             </plugin>
           </plugins>
         </build>
       </profile>


• çağırmak için:
   $ mvn <phase> -Pproduction
Ö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>
İ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
İ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
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
?
Teşekkürler



http://www.jroller.com/mert

        @mertcal

More Related Content

Similar to Gelecex - Maven ile Akilli Projeler

20100925 sola-android
20100925 sola-android20100925 sola-android
20100925 sola-androidandroid sola
 
автоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcавтоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcIgor Khrol
 
OpenERP V6 Technical Improvements
OpenERP V6 Technical  ImprovementsOpenERP V6 Technical  Improvements
OpenERP V6 Technical ImprovementsOdoo
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSergio Alonso
 
Nodejs on android
Nodejs on androidNodejs on android
Nodejs on android俊夫 森
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NETBruno Capuano
 
Workshop: Virtualisation in der private Cloud mit xen Server Platinum Edition
Workshop: Virtualisation in der private Cloud mit xen Server Platinum EditionWorkshop: Virtualisation in der private Cloud mit xen Server Platinum Edition
Workshop: Virtualisation in der private Cloud mit xen Server Platinum EditionDigicomp Academy AG
 
whatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minuteswhatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minutesidsecconf
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶 wensheng wei
 
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJSDevInRio 2010 - NodeJS
DevInRio 2010 - NodeJSEmerson Macedo
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesSpring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesDr. Spock
 
Glass fishjavaee6directseminar
Glass fishjavaee6directseminarGlass fishjavaee6directseminar
Glass fishjavaee6directseminarYoshio Terada
 

Similar to Gelecex - Maven ile Akilli Projeler (15)

张宴NGINX
张宴NGINX张宴NGINX
张宴NGINX
 
20100925 sola-android
20100925 sola-android20100925 sola-android
20100925 sola-android
 
автоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcавтоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rc
 
OpenERP V6 Technical Improvements
OpenERP V6 Technical  ImprovementsOpenERP V6 Technical  Improvements
OpenERP V6 Technical Improvements
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
 
Nodejs on android
Nodejs on androidNodejs on android
Nodejs on android
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET
 
Workshop: Virtualisation in der private Cloud mit xen Server Platinum Edition
Workshop: Virtualisation in der private Cloud mit xen Server Platinum EditionWorkshop: Virtualisation in der private Cloud mit xen Server Platinum Edition
Workshop: Virtualisation in der private Cloud mit xen Server Platinum Edition
 
whatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minuteswhatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minutes
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJSDevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
 
Der lachende Dritte
Der lachende DritteDer lachende Dritte
Der lachende Dritte
 
Symm basics
Symm basicsSymm basics
Symm basics
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesSpring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
 
Glass fishjavaee6directseminar
Glass fishjavaee6directseminarGlass fishjavaee6directseminar
Glass fishjavaee6directseminar
 

More from Mert Çalışkan

MicroProfile for MicroServices
MicroProfile for MicroServicesMicroProfile for MicroServices
MicroProfile for MicroServicesMert Çalışkan
 
jDays2015 - JavaEE vs. Spring Smackdown
jDays2015 - JavaEE vs. Spring SmackdownjDays2015 - JavaEE vs. Spring Smackdown
jDays2015 - JavaEE vs. Spring SmackdownMert Çalışkan
 
BMO - Intelligent Projects with Maven
BMO - Intelligent Projects with MavenBMO - Intelligent Projects with Maven
BMO - Intelligent Projects with MavenMert Çalışkan
 
Intelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulIntelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulMert Çalışkan
 
JavaOne - 10 Tips for Java EE 7 with PrimeFaces
JavaOne - 10 Tips for Java EE 7 with PrimeFacesJavaOne - 10 Tips for Java EE 7 with PrimeFaces
JavaOne - 10 Tips for Java EE 7 with PrimeFacesMert Çalışkan
 
Jdc 2010 - Maven, Intelligent Projects
Jdc 2010 - Maven, Intelligent ProjectsJdc 2010 - Maven, Intelligent Projects
Jdc 2010 - Maven, Intelligent ProjectsMert Çalışkan
 

More from Mert Çalışkan (8)

MicroProfile for MicroServices
MicroProfile for MicroServicesMicroProfile for MicroServices
MicroProfile for MicroServices
 
jDays2015 - JavaEE vs. Spring Smackdown
jDays2015 - JavaEE vs. Spring SmackdownjDays2015 - JavaEE vs. Spring Smackdown
jDays2015 - JavaEE vs. Spring Smackdown
 
BMO - Intelligent Projects with Maven
BMO - Intelligent Projects with MavenBMO - Intelligent Projects with Maven
BMO - Intelligent Projects with Maven
 
Intelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulIntelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest Istanbul
 
JavaOne - 10 Tips for Java EE 7 with PrimeFaces
JavaOne - 10 Tips for Java EE 7 with PrimeFacesJavaOne - 10 Tips for Java EE 7 with PrimeFaces
JavaOne - 10 Tips for Java EE 7 with PrimeFaces
 
Better Career with Java
Better Career with JavaBetter Career with Java
Better Career with Java
 
Jdc 2010 - Maven, Intelligent Projects
Jdc 2010 - Maven, Intelligent ProjectsJdc 2010 - Maven, Intelligent Projects
Jdc 2010 - Maven, Intelligent Projects
 
Fikrim Acik Kodum Acik
Fikrim Acik Kodum AcikFikrim Acik Kodum Acik
Fikrim Acik Kodum Acik
 

Gelecex - Maven ile Akilli Projeler

  • 1. Maven ile Akıllı Projeler Mert ÇALIŞKAN Gazi Üniversitesi 01.2011
  • 2. Ben... • Mert ÇALIŞKAN • Yazılımcı ! STM A.Ş. • Açık Kaynak Kodlu Yazılım Savunucusu • Apache Software Foundation • OpenLogic Expert Community
  • 3. Siz? + Gradle
  • 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#
  • 9. POM <project ...> <parent /> <groupId /> <artifactId /> <version /> <packaging /> <developers /> <contributors /> <scm>... </scm> <build> <plugins>....</plugins> </build> <dependencies>....</dependencies> <repositories>....</repositories> <pluginRepositories>... </pluginRepositories> <profiles>...</profiles> <reporting>... </reporting> </project>
  • 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
  • 15. default validate mvn <phase> compile mvn <phase:goal> mvn <phase> <phase:goal> test mvn <phase:goal> <phase:goal> package $ mvn integration-test integration-test validate verify compile install test deploy package integration-test
  • 16. Bağımlılık Yönetimi • Koordinatları belirle ! (GAV faktörü) <dependency> <groupId>benimsirketim</groupId> <artifactId>superprojem</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> • Geçişli Bağımlılıklar İstediğin bağımlılıklar ve onların bağımlı oldukları... İstemediğin bağımlılıkları hariç tut..
  • 17. $ mvn dependency:tree [INFO] net:eniyiyemek:war:1.0-SNAPSHOT [INFO] +- org.jboss.seam:jboss-seam:jar:2.2.0.GA:compile [INFO] | +- xstream:xstream:jar:1.1.3:compile [INFO] | +- xpp3:xpp3_min:jar:1.1.3.4.O:compile [INFO] | - org.jboss.el:jboss-el:jar:1.0_02.CR4:compile [INFO] +- org.jboss.seam:jboss-seam-ui:jar:2.2.0.GA:compile [INFO] | +- org.jboss.seam:jboss-seam:ejb:2.2.0.GA:compile [INFO] | +- org.jboss.seam:jboss-seam-jul:jar:2.2.0.GA:compile [INFO] | - commons-beanutils:commons-beanutils:jar:1.7.0:compile [INFO] +- org.jboss.seam:jboss-seam-mail:jar:2.2.0.GA:compile [INFO] +- javax.mail:mail:jar:1.4.1:compile [INFO] | - javax.activation:activation:jar:1.1:compile [INFO] +- quartz:quartz:jar:1.6.0:compile [INFO] +- commons-logging:commons-logging:jar:1.1.1:compile [INFO] +- javax.faces:jsf-api:jar:1.2_13:compile [INFO] +- javax.faces:jsf-impl:jar:1.2_13:compile [INFO] +- com.sun.facelets:jsf-facelets:jar:1.1.14:compile [INFO] +- jstl:jstl:jar:1.2:compile [INFO] +- org.primefaces:primefaces-stable:jar:1.0.0:compile [INFO] +- javax.transaction:jta:jar:1.1:compile [INFO] +- org.hibernate:hibernate-core:jar:3.5.0-Beta-2:compile [INFO] | +- antlr:antlr:jar:2.7.6:compile [INFO] | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | - org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] +- org.hibernate:hibernate-annotations:jar:3.5.0-Beta-2:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Beta1:compile [INFO] | +- org.hibernate.java-persistence:jpa-api:jar:2.0-cr-1:compile [INFO] | - hsqldb:hsqldb:jar:1.8.0.2:compile [INFO] +- org.hibernate:hibernate-entitymanager:jar:3.5.0-Beta-2:compile [INFO] | - cglib:cglib:jar:2.2:compile [INFO] | - asm:asm:jar:3.1:compile [INFO] +- org.hibernate:hibernate-validator-legacy:jar:4.0.2.GA:compile
  • 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
  • 32. Bağımlılık / Proje Yönetimi Inheritance Aggregation
  • 33. Kalıtım <project> <modelVersion>4.0.0</modelVersion> <parent> parentapp <groupId>com.gelecex.gazi2011</groupId> <artifactId>ana_app</artifactId> <<extends>> <version>1.0.0</version> </parent> <groupId>com.gelecex.gazi2011</groupId> sampleapp <artifactId>ornek_app</artifactId> <version>1.0.0</version> </project>
  • 34. Kalıtım <dependencyManagement/> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.gelecex.gazi2011</groupId> <artifactId>ana_app</artifactId> <packaging>pom</packaging> parentapp <version>1.0</version> <dependencyManagement> <<extends>> <dependencies> <dependency> <groupId>commongs-logging</groupId> sampleapp <artifactId>commongs-logging</artifactId> <version>1.1.1</version> </dependency> </dependencies> </dependencyManagement> </project>
  • 35. Kalıtım <dependencyManagement/> <project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.gelecex.gazi2011</groupId> parentapp <artifactId>ana_app</artifactId> <version>1.0</version> </parent> <<extends>> <artifactId>ornek_app</artifactId> <dependencies> <dependency> sampleapp <groupId>commongs-logging</groupId> <artifactId>commongs-logging</artifactId> </dependency> </dependencies> </project> versiyon 1.1.1’i alacak
  • 36. Modüler Yapı (Aggregation) <<depends>> <<depends>> ProjectA ProjectB ProjectC root $ cd ProjectC } projectC $ mvn compile projectC $ cd .. root $ cd ProjectB projectB $ mvn compile 8 satır !!! projectB $ cd .. root $ cd ProjectA projectA $ mvn compile
  • 37. POM modulesapp modulesapp: <<module>> <project> <<module>> <modelVersion>4.0.0</modelVersion> <<module>> <groupId>com.gelecex.gazi2011</groupId> <artifactId>modul_app</artifactId> ProjectA ProjectB <packaging>pom</packaging> <version>1.0</version> <name>modul_app</name> <modules> ProjectC <module>projectA</module> <module>projectB</module> </modules> root $ cd modulesapp </project> modulesapp $ mvn compile
  • 38. M2_REPO/javax/activation/activation/1.1/activation-1.1.jar M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar Ambar M2_REPO/asm/asm/3.1/asm-3.1.jar M2_REPO/cglib/cglib/2.2/cglib-2.2.jar M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar M2_REPO/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar (Repository) M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar M2_REPO/org/hibernate/hibernate-annotations/3.5.0-Beta-2/hibernate-annotations-3.5.0-Beta-2.jar M2_REPO/org/hibernate/hibernate-commons-annotations/3.2.0.Beta1/hibernate-commons-annotations-3.2.0.Beta1.jar M2_REPO/org/hibernate/hibernate-core/3.5.0-Beta-2/hibernate-core-3.5.0-Beta-2.jar M2_REPO/org/hibernate/hibernate-entitymanager/3.5.0-Beta-2/hibernate-entitymanager-3.5.0-Beta-2.jar M2_REPO/org/hibernate/hibernate-validator-legacy/4.0.2.GA/hibernate-validator-legacy-4.0.2.GA.jar M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar M2_REPO/org/jboss/el/jboss-el/1.0_02.CR4/jboss-el-1.0_02.CR4.jar M2_REPO/org/jboss/seam/jboss-seam/2.2.0.GA/jboss-seam-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-jul/2.2.0.GA/jboss-seam-jul-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-mail/2.2.0.GA/jboss-seam-mail-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-ui/2.2.0.GA/jboss-seam-ui-2.2.0.GA.jar M2_REPO/org/hibernate/java-persistence/jpa-api/2.0-cr-1/jpa-api-2.0-cr-1.jar M2_REPO/javax/faces/jsf-api/1.2_13/jsf-api-1.2_13.jar M2_REPO/com/sun/facelets/jsf-facelets/1.1.14/jsf-facelets-1.1.14.jar M2_REPO/javax/faces/jsf-impl/1.2_13/jsf-impl-1.2_13.jar JSF M2_REPO/jstl/jstl/1.2/jstl-1.2.jar M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar PrimeFaces M2_REPO/javax/mail/mail/1.4.1/mail-1.4.1.jar M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar M2_REPO/org/primefaces/primefaces-stable/1.0.0/primefaces-stable-1.0.0.jar Seam M2_REPO/quartz/quartz/1.6.0/quartz-1.6.0.jar M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar M2_REPO/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar JPA M2_REPO/org/slf4j/slf4j-nop/1.5.6/slf4j-nop-1.5.6.jar M2_REPO/org/testng/testng/5.9/testng-5.9.jar M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar Hibernate M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar
  • 39. M2_REPO/javax/activation/activation/1.1/activation-1.1.jar M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar M2_REPO/asm/asm/3.1/asm-3.1.jar M2_REPO/cglib/cglib/2.2/cglib-2.2.jar M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar M2_REPO/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar M2_REPO/org/hibernate/hibernate-annotations/3.5.0-Beta-2/hibernate-annotations-3.5.0-Beta-2.jar 40 M2_REPO/org/hibernate/hibernate-commons-annotations/3.2.0.Beta1/hibernate-commons-annotations-3.2.0.Beta1.jar M2_REPO/org/hibernate/hibernate-core/3.5.0-Beta-2/hibernate-core-3.5.0-Beta-2.jar M2_REPO/org/hibernate/hibernate-entitymanager/3.5.0-Beta-2/hibernate-entitymanager-3.5.0-Beta-2.jar M2_REPO/org/hibernate/hibernate-validator-legacy/4.0.2.GA/hibernate-validator-legacy-4.0.2.GA.jar M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar M2_REPO/org/jboss/el/jboss-el/1.0_02.CR4/jboss-el-1.0_02.CR4.jar M2_REPO/org/jboss/seam/jboss-seam/2.2.0.GA/jboss-seam-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-jul/2.2.0.GA/jboss-seam-jul-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-mail/2.2.0.GA/jboss-seam-mail-2.2.0.GA.jar M2_REPO/org/jboss/seam/jboss-seam-ui/2.2.0.GA/jboss-seam-ui-2.2.0.GA.jar M2_REPO/org/hibernate/java-persistence/jpa-api/2.0-cr-1/jpa-api-2.0-cr-1.jar M2_REPO/javax/faces/jsf-api/1.2_13/jsf-api-1.2_13.jar M2_REPO/com/sun/facelets/jsf-facelets/1.1.14/jsf-facelets-1.1.14.jar M2_REPO/javax/faces/jsf-impl/1.2_13/jsf-impl-1.2_13.jar M2_REPO/jstl/jstl/1.2/jstl-1.2.jar M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar M2_REPO/javax/mail/mail/1.4.1/mail-1.4.1.jar M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar M2_REPO/org/primefaces/primefaces-stable/1.0.0/primefaces-stable-1.0.0.jar M2_REPO/quartz/quartz/1.6.0/quartz-1.6.0.jar M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar M2_REPO/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar M2_REPO/org/slf4j/slf4j-nop/1.5.6/slf4j-nop-1.5.6.jar M2_REPO/org/testng/testng/5.9/testng-5.9.jar M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar
  • 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ı
  • 41. Ambarlar (Repositories) <repository> <id>jboss-repo</id> <name>The Release JBoss maven repo</name> <url>http://repository.jboss.org/maven2</url> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>jboss-snapshot-repo</id> <name>The Snapshot JBoss maven repo</name> <url>http://snapshots.jboss.org/maven2</url> <snapshots> <enabled>true</enabled> </snapshots> </repository>
  • 42. Bağımlılıkları bulmak için... • http://repository.apache.org • http://www.jarvana.com • http://www.artifact-repository.org • http://mvnrepository.com • http://www.mvnbrowser.com • http://mavensearch.net
  • 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
  • 49. DEMO 2 2 DEMO dakikada web uygulaması
  • 50. MOJO’nuzu arttırmanın yolları... mvn help:describe -Dplugin=<anygoal> • plugin’in goal’lerini ve tanımlarını listeler mvn help:system Sistem değişkenlerini ve ortam değişkenlerini listelemek için
  • 51. Profilleri Kullanın • Profiller yarat: development, staging & production <profile> <id>production</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <debug>false</debug> <optimize>true</optimize> </configuration> </plugin> </plugins> </build> </profile> • çağırmak için: $ mvn <phase> -Pproduction
  • 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
  • 56. ?