Maven: Yaşam Döngüsü - Aşama - Eklenti - Hedef [kapalı]


106

Burada nispeten yeni geliştirici, bir süredir kullanmama rağmen, Maven temellerimi sağlamlaştırmayı umuyorum. Sorunumun bir kısmı, Ant'la hiçbir deneyimimin olmaması , ki bu pek çok açıklamanın kaynağı gibi görünüyor. Dersleri okuyup izliyorum ve aynı terimleri duymaya devam ediyorum:

  • Yaşam döngüsü
  • Evre
  • Eklenti
  • Hedef

Öğrendiklerime göre, yaşam döngüsünün en geniş grup olduğu ve aşamalardan, eklentilerden ve / veya hedeflerden oluştuğu (veya bunlarla tamamlandığı) görülüyor.

Soru : Bu terimlerin birbirleriyle nasıl bağlantılı olduğu ve en yaygın örnekler hakkında bilgi verebilir misiniz?

Ne kadar açık ve basit olursa o kadar iyidir!



Teşekkürler @Drejc - bunu aramamda bulamadığıma inanamıyorum. Şimdi baştan sona okuyacağım.
Jeff Levine

2
Öyleyse, açıklığa kavuşturmak için yaşam döngüsü = yaşam döngüsü oluşturun , bunlardan üç tür vardır: varsayılan, temiz ve site? Diğer açıklamalar, yapı adında dördüncü bir yaşam döngüsü olduğunu düşünmemi sağladı .
Jeff Levine


3
Çok geniş? Bu, Maven'in temel temelleriyle ilgilidir ve birkaç iyi ve ayrıntılı cevabı vardır. Tek bir maven etiketi olmayan moderatörlerin buna karar vermesine izin verilmemelidir.
Gerold Broser

Yanıtlar:


73

Bir Maven yaşam döngüsü , bir (soyut) kavramı olduğunu kapakları tüm adımlar (veya daha iyisi: Maven destek kararı tasarımcılar tüm adımları) Bir projenin gelişim ömrü gerçekleşmesi beklenmektedir. Bu adımlar (veya aşamalar), Maven terminolojisinde aşamalar olarak adlandırılır .

Bir Maven eklentisi , hedeflerin / tedarikçi için bir kapsayıcıdır . Hedeflerde uygulanan kod, gerçek iş gücüdür. ( Maven kendi özünde sadece eklentileri yönetiyor ve hedefleri uyguluyor ). Bir eklentinin hedeflerinden her biri, yaşam döngüsü aşamalarından herhangi birine atanabilir / bağlanabilir.

Maven'i çağırırken mvn <phase> , tüm aşamaları (her seferinde) geçer ve verilen aşamadan önceki ve bu aşamaya kadarki (ve dahil) aşamalardan herhangi birine bağlı olan tüm hedefleri (eklentiler tarafından sağlanan ) yürütür . Hedefi olmayan bir aşama varsa hiçbir şey yapılmaz. Ancak aşama yine de geçilir.

Yani Maven'in yerleşik yaşam döngülerinden birine "ek aşamalar" ekleyemezsiniz . Onlar zaten oradalar, her zaman! Kendi yaşam döngünüzü kendi aşamalarıyla geliştirebilirsiniz, ancak bu sadece Maven'i olduğu gibi kullanmanın çok ötesinde.

Ayrıca, mvnherhangi bir aşama veya hedef olmadan koşarken size söylenen hedefler doğrudan da gerçekleştirilebilir [burada satır kesmeleri ve okunabilirlik için kısaltılmış]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Referanslar:

Maven'in POM'da herhangi bir hedef bağlayıcılığı olmadan ne yapacağını nasıl bildiğini merak ettiyseniz default-bindings.xml, sonunda bulunan bir bağlantı vardır <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Yerleşik yaşam döngülerinin aşamaları ( temiz , varsayılan , site ) <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlaltında bildirilmiştir .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.


41

Maven: Yaşam Döngüsü, Aşama, Eklenti, Hedef

Bu iş parçacığında eksik olan başka bir ayrıntı düzeyini açıklığa kavuşturmak için geç yanıt vermek: bir Maven yapısının en küçük birimleri olan yürütmeler (bir hedefin).

Bu nedenle, belirli eklentiler tarafından sağlanan bir dizi yapılandırılmış hedefi çağırabilen aşamalardan (daha düşük ayrıntı düzeyi, bir döngü adımı) oluşan döngüleri (temelde belirli bir genel hedef için eylemler kümesi) oluşturduk . Yani, Maven (aynı zamanda) bir eklenti yürütücüsüdür, her eklenti bir veya daha fazla hedef sunabilir. Daha sonra (ayrıca) hangi hedefin hangi aşamaya ekleneceğine karar verirsiniz, çoğu zaman temerrüt yaşam döngüsünde (herhangi biri olmadan, yani varsayılan). Ancak aslında başka bir seviyeye sahip olabilirsiniz: yürütmeler (aynı hedef, aynı eklentiden veya farklı eklentilerden farklı hedefler)

Bütününü devam ettirmek için hazırladığım bir resim görüntü açıklamasını buraya girin

Ve gerçekten de Maven onu (en küçük iş birimini) derleme günlüğündeki benzersiz dizge aracılığıyla gösteriyor:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Örneğin, bizde:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

Bu aslında şu anlama gelir (farklı ayrıntı düzeyleriyle):

  • sırasında compilefaz (belirtilmemiştir, ne yazık ki)>
  • Maven Derleyici eklentisini çalıştırıyorum ( artifactIdve version)>
  • compileAmacına başvuruyorum >
  • default-compileyürütme tarafından tanımlandığı gibi

Bu benzersizdir çünkü aslında aynı hedefe (aynı eklentinin) farklı aşamalara veya aynı aşamaya, ancak farklı uygulamalarda (yani, farklı konfigürasyonlarla) bağlı olabilirsiniz. maven-compiler-pluginÖrneğin, aynı zamanda sırasında kullanılan test-compilefaz (onun ile derleme test kodu (a farklı faz) testCompilefarklı bir yürütme hedef) ( default-testCompile). Ayrıca, POM'da (ve muhtemelen farklı bir konfigürasyonda) belirlediğiniz bir yürütme tarafından tanımlanan farklı bir aşamada otomatik olarak üretilen bazı kodları derleyebilirsiniz (aynı eklentiyi ve hedefi kullanarak).

Varsayılan yürütmeler, kutudan çıkar çıkmaz Maven paketleme bağlamaları aracılığıyla sağlanır , yani varsayılan olarak (ve yapılandırma yerine konvansiyonu zorunlu kılarak) Maven, belirli aşamalarda belirli hedefleri (standart eklentilerin) zaten başlatır. Bu varsayılan çağrıların yürütme kimlikleri belirli kurallara göre tanımlanır .

Bu ayrıca, bir Maven yapısının varsayılan bir davranışını (bağlanmasını) gerçekten geçersiz kılmak istiyorsanız, aynı eklenti için POM'unuzda tam olarak aynı yürütme kimliğini belirtmeniz (geçersiz kılmanız) gerektiğini de açıklar. Örneğin, maven-compiler-pluginaynı default-compilekimliğe sahip ancak mevcut olmayan bir aşamaya (veya boş bir aşamaya) bağlı olan bir yürütmeyi tanımlayan derlemeyi atlayabilirsiniz .

Kısaca söylemek gerekirse : bir yürütme, Maven'e hangi aşamada hangi konfigürasyonla hangi hedefleri yürüteceğini söyler.

Bazı yürütmeler varsayılan olarak sağlanır (varsayılan bağlamalar), bu da yalnızca 6 satırlık maven minimal pom'un neden çok şey yapabildiğini açıklar (derleme, test etme, paketleme vb.): Belirli aşamalarda standart eklentilerin hedeflerini yürütme: yapılandırma. Daha sonra, yapılandırma yoluyla, yapıya malzeme (yürütme) ekleyebilir veya önceden yapılandırılmış eklentilerin davranışını etkileyebilirsiniz (bu durumda bölüm yok , ancak yeterli olacaktır).pom.xmlexecutionsconfiguration

Evet, derleme döngülerini (ve bunların aşamalarını) atlayabilir ve doğrudan hedefleri (eklentilerin) çağırabilirsiniz. Aşağıdakileri hayal edin:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(NOT: yalnızca bir aramada satır içi olarak da çağırabilirsiniz)

Burada uygulama kodunu, test kodunu, yürütme testleri ve paketi derliyoruz: Bunun manuel, hataya açık, tekrarlayan ve zaman alıcı olacağını hayal edin. Konfigürasyon üzerine konvansiyon bize yardımcı olur: Maven, inşa yaşam döngüleri ve aşamaları sunar . Varsayılan yaşam döngüsü (isimsiz, yani varsayılan), en iyi uygulamalara ve kurallara (Maven mantrası) dayalı bir dizi aşama sağlar.
Yukarıdakinin aynısını elde etmek istiyorsanız, çalıştırın: mvn packageve projenizi otomatik olarak derler, test eder ve paketler. Nasıl? eklentileri çağırmak. Yani aşamalar, anlamlı ve yapılandırılabilir eklenti (hedef) yürütme kümesidir. Daha da standart hale getirmek için, her aşama için Maven önce herhangi bir önceki aşamayı çağıracaktır, böylece örneğin test etmek istiyorsanız ilk olarak derlediğinizden emin olacaksınız.

ps aynı için birkaç hedef belirlerken execution, iki farklı hedef için (bu nedenle, yine de benzersiz tuple) iki farklı yürütmeyi (aynı id ile) hala derleme günlüğünde açıkça göreceğinizi unutmayın.


18

Sandeep Jindal ve Premraj'a kredi (buradan itibaren Maven hedefleri ve aşamaları nelerdir ve aralarındaki fark nedir? ). Açıklamaları anlamama yardımcı oluyor.

Burada bazı tam kod örnekleri ve bazı basit açıklamalar oluşturdum https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Bence başkalarının anlamasına yardımcı olabilir ve bir şeyi doğrudan deneyebilir.

Kısaca bağlantıdan, üçünü de aynı anda anlamaya çalışmamalısınız, önce bu gruplardaki ilişkiyi anlamalısınız:

  • Yaşam Döngüsü ve Faz
  • Eklenti - Hedef

1. Yaşam Döngüsü - Faz

Yaşam Döngüsü , sırayla bir aşama koleksiyonudur, burada Yaşam Döngüsü Referanslarına bakın . Bir aşama çağırdığınızda , ondan önceki tüm aşamaları da çağıracaktır .

Örneğin, temiz yaşam döngüsünün 3 aşaması vardır ( ön temizleme, temizleme, temizleme sonrası ).

mvn clean

Ön temizliği ve temizliği arayacaktır .

2. Eklenti - Hedef

Hedef , Eklenti'deki bir eylem gibidir . Yani eklenti bir sınıfsa, amaç bir yöntemdir.

şöyle bir hedef diyebilirsiniz:

mvn clean:clean

Bu, "temiz eklentide temiz hedefi çağırın" anlamına gelir (Burada hiçbir şey temiz aşama ile ilgili değildir. "Temiz" kelimesinin kafanızı karıştırmasına izin vermeyin, bunlar aynı değildir! Yukarıdaki bağlantımda tam açıklamaya bakın)

3. Şimdi Aşama ve Hedef arasındaki ilişki:

Aşama , Hedef (ler) e (önceden) bağlanabilir . Örneğin, normalde temiz aşama temiz hedefe bağlanır. Yani, bu komutu çağırdığınızda:

mvn clean

Temiz: temiz hedefine bağlanan ön temizleme aşaması ve temiz aşama olarak adlandırılacaktır.

Neredeyse aynıdır:

mvn pre-clean clean:clean

1
@ 2. & 3. IMHO, clean:cleanbir örnek için en iyi seçim değildir. cleanÖzellikle yeni başlayanlar için kafa karıştırıcı olabilecek (yaşam döngüsü, aşama, eklenti, hedef) adlı 4 öğe var (başlangıçta benim için olduğunu hatırlıyorum). @ 3. "Bağlantı" fiili de iyi bir seçim değil, IMHO. Resmi Maven terimi " bağlama " dır .
Gerold Broser

@GeroldBroser. Clean: clean ile tamamen aynı fikirde. Bunu bağlantıdaki tam açıklamamda açıklamış ve uyardım. Bu uyarıları da buraya kopyalayacağım. Bunu kullanmamın nedeni, insanların bu kafa karıştırıcı kelimeyi bilmesinin iyi olması ve özellikle de resmi maven belgesinin onu kullanıyor olması ve bu açıkça açıklıyor. Ve evet, benim de kafa karıştırıcıydı. Her neyse, yorumlar için çok teşekkürler
Surasin Tancharoen

yazım hatası: resmi maven belgesi kullanıyor ve açıkça açıklamıyor
Surasin Tancharoen

17

Ve gecikmeli olarak başka bir diyagram

  • Yaşam döngüsü sarı dikdörtgen olarak
  • Aşamaları ile mavi dikdörtgenler olarak yaşam döngüsünün "çağrılabilir" koyu mavi fazların (bunlar iyi tanımlanmış durumda projeyi bırakmak tasarlanmamış olabilir olarak yani hypenation ile fazlar genellikle komut satırından denir değildir).
  • Mavi pastiller olarak hedefler . Gösterilen ilişkilendirme / bağlama "aşaması -> hedef", "kavanoz" paketleme modlarından biridir . Her aşamanın kendisine bağlı hedefleri olabilir. Bu tabi ki her bir yaşam döngüsü için geçerlidir, ancak bağlamalar yalnızca "varsayılan" yaşam döngüsü için gösterilir.
  • Gri kırpılmış dikdörtgenler olarak eklentiler . Eklentiler, Aşamalara bağlanabilecek Hedefleri sağlar.

Maven Yaşam Döngüleri, Aşamaları, Hedefleri, Eklentileri


Graphml dosyası (ücretsiz yEd
David Tonhofer

1) " Koyu mavi " olan "çağrılabilir" aşamalarla tam olarak neyi kastediyorsunuz ? Her Maven faz (Daha doğrusu diyoruz olsa "çağrılabilir" dir Invokable kod bulunmadığından beri, denilen doğrudan faz çağırarak). Veya kendisine bağlı bir hedefi olan aşamalara " çağrılabilir " mi diyorsunuz (varsayılan olarak)? Hatta o sen bakarsanız, doğrudur , ve . validateinitializeverify
Gerold Broser

2) resources:[testR|r]esourcesAmaç, yaşam döngüsündeki process-sourcesveya process-test-sourcesaşamalarınajar bağlı DEĞİLDİR .
Gerold Broser

3) modello:javaarasında Modello tapa görünüşte alan özeldir. Bir eklentinin hedefini bir aşamaya bağlamak, aşamalardan herhangi biri için geçerlidir.
Gerold Broser

@GeroldBroser Yorumlara göre düzeltildi. "Çağrılabilir", birinin onu komut satırından çağırabileceği ve projenin geçerli bir durumda kalmasını bekleyebileceği anlamına gelir. Arasında anlamlı bir fark vardır çağıran ve yürütmesini ve çağrıya neyi olduğunu Maven Giriş kullanır.
David Tonhofer

12

Kaynak bu gerçekten iyi bir öğretici

Yaşam Döngüleri, Yaşam Döngüsü Aşamaları, Eklentiler ve Eklenti Hedefleri, Maven'in özüdür.

  • Maven komutu mvn , bağımsız değişken olarak yalnızca Yaşam Döngüsü Aşamasını veya Eklenti Hedefini kabul edebilir.
  • Maven üç yaşam döngüsü ile birlikte gelir - varsayılan, temiz ve site.
  • Her yaşam döngüsü yaşam döngüsü aşamalarından oluşur ve toplamda 28 aşama vardır - varsayılan 21 ( doğrulama, ..., derleme, ..., paket, ..., yükleme, dağıtma ), temizleme 3 ( ön temizleme, temiz, temizlik sonrası ) ve site 4 ( site öncesi, site, site sonrası, site dağıtım ).
  • bir yaşam döngüsü aşaması mvn komutu kullanılarak çağrıldığında, önceki tüm aşamalar birbiri ardına sırayla yürütülür.
  • yaşam döngüsü aşamalarının kendi başlarına bazı görevleri yerine getirme yeteneği yoktur ve görevi yerine getirmek için eklentilere güvenirler.
  • Proje ve paketleme türüne bağlı olarak Maven, çeşitli eklenti hedeflerini yaşam döngüsü aşamalarına bağlar ve hedefler kendilerine verilen görevi yerine getirir.

Bir Java Projesinde " mvn paketi " çalıştırdığımızda , Maven eklenti hedeflerini bir sonraki şekilde gösterildiği gibi yaşam döngüsü aşamalarına bağlar.

mvn-eklentileri-paket-hedefi


1
Bahsettiğiniz materyal oldukça iyi. Teşekkür ederim!
William Kinaan

@ " Maven komutu mvn , bağımsız değişken olarak yalnızca Yaşam Döngüsü Aşamasını veya Eklenti Hedefini kabul edebilir. " Doğru değil. Seçenekleri de kabul eder .
Gerold Broser

" Bir Java Projesinde" mvn paketi "çalıştırdığımızda, Maven eklenti hedeflerini yaşam döngüsü aşamalarına bağlar " doğru değildir. Hedef bağlama, çalıştırmadan çok önce gerçekleşir mvn ...: default-bindings.xml'de veya bir POM'da ve Maven tarafından değil, bir insan tarafından yapılır.
Gerold Broser

7

Bu nedenle, burada özetlendiği gibi biraz daha açıklamak için

Maven yapıları yaşam döngülerine bölünmüştür, bunlar:

  • temiz
  • inşa (varsayılan)
  • site

Bu döngülerin her biri aşamalara ayrılmıştır. Örneğin, derleme aşağıdaki gibi aşamalara ayrılmıştır:

  • kaynakları hazırlamak
  • derlemek
  • paket
  • Yüklemek

Aşamaları önce çalıştırmak için hedefleri var öncesi ve sonrasında post- örneğin bir faz:

  • ön temizleme - temizleme aşamasından önce yürütülecektir
  • temizleme sonrası - temizleme aşamasından sonra yürütülecektir

İsterseniz hedefleri ek "eklenmiş" aşamalar olarak görüntüleyebilirsiniz. Ayrıntılar için burayı okuyun veya @Gerolds cevabına bakın.


1
Bu cevap bütünüyle doğru değil. Cevabımı gör .
Gerold Broser

Oğlum 3 yıldır bu soruyu cevapladığından beri ... ve hala bırakmıyorsun .. kazandın ... şimdi devam et.
Drejc

Kazanmakla ilgili değil. Daha sonra bunlarla karşılaşırsanız eski soruları, cevapları ve yorumları gözden geçirmez misiniz?
Gerold Broser

3

LifeCycle vs Phases: Life Cycle bir koleksiyondur phases. Bir aşama çağırdığınızda, ondan önce gelen tüm aşamaları da çağırır. Maven, aşağıdaki gibi 3 yerleşik yapı yaşam döngüsüyle birlikte gelir:

  1. Temiz yaşam döngüsü - bu, projenin temizlenmesini içerir (yeni bir oluşturma ve dağıtım için)
  2. Varsayılan / derleme yaşam döngüsü - bu, projenin tam dağıtımını yönetir
  3. Site yaşam döngüsü - bu, projenin java belgelerini oluşturmayı ele alır. görüntü açıklamasını buraya girin

Temiz yaşam döngüsünün 3 aşaması vardır: ön temizleme, temizleme ve temizleme sonrası. Varsayılan ve site yaşam döngülerinin aşamaları resimde gösterilenle aynıdır.


Son paragrafınız yanıltıcı. Özellikle ilk ve son cümle. Hedefler ve aşamalar tamamen farklı şeylerdir. Bazılarının isimleri aynı olduğu için onları karıştırmamalısınız. Re " Hedefler yukarıdaki resimde gördüğünüz aşamalardır. ": Resimde belirtilen tek bir amaç yok. Bunların hepsi aşamalardır . Re " Sen belirli amaca gerçekleştirmek zorunda 'hedefi' olarak faz adını yazın. ": Bir eklentinin golü explicitely zamanki gibi belli bir yapı kadar yapmaktır çalıştırmak mümkün olsa da faz ile mvn <phase>. Cevabımı burada görün.
Gerold Broser

Teşekkürler, "Eklenti vs Hedef" bölümünü kaldırdım. Yakında güncelleyeceğim.
Arun Raaj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.