Maven ebeveyn pom vs modüller pom


284

Çok pompalı bir yapıda ana pomları yapılandırmanın birkaç yolu var gibi görünüyor ve herkesin her şekilde avantajları / dezavantajları hakkında herhangi bir düşüncesi olup olmadığını merak ediyorum.

Bir ebeveyn pom'a sahip olmanın en basit yöntemi onu bir projenin köküne koymak olacaktır.

myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

burada pom.xml hem ana projedir hem de -core -api ve -app modüllerini açıklar

Bir sonraki yöntem, üst öğeyi kendi alt dizinine ayırmaktır.

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/

Üst pompanın hala modülleri içerdiği ancak göreceli oldukları, örneğin ../myproject-core

Son olarak, modül tanımının ve üst öğenin

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

Üst pompanın herhangi bir "paylaşılan" konfigürasyon içerdiği (bağımlılık Yönetimi, özellikler vb.) Ve myproject / pom.xml modüllerin listesini içerir.

Niyet, büyük ölçekli bir yapıya ölçeklenebilir olmaktır, bu nedenle çok sayıda proje ve eser için ölçeklenebilir olmalıdır.

Birkaç bonus soru:

  • Kaynak kontrolü, dağıtım dizinleri, ortak eklentiler vb. Gibi çeşitli paylaşılan yapılandırmayı tanımlamak için en iyi yer neresidir (Ebeveyni varsayıyorum ancak sık sık bunun tarafından ısırıldım ve daha ziyade her projede sona erdi. ortak bir).
  • Maven-release eklentisi, hudson ve nexus, çoklu projelerinizi nasıl kurduğunuzla nasıl başa çıkıyor (muhtemelen dev bir soru, çok projeli bir yapı kurulduğunda kimse yakalandıysa daha fazla)?

Düzenleme: Alt projelerin her biri kendi pom.xml var, ben onu tutmak için dışarıda bıraktım.


Modüllerin her biri kendi pompasına da sahip mi? Projemde bir ebeveyn pom var, ancak modüllerin her birinde de bir pom var. (u tanımlamak için belki de dördüncü bir yol)
harschware

Ah, evet, düzenleyeceğim ve güncelleyeceğim. Alt modüllerin her birinin kendi pompası da vardır.
Jamie McCrindle

3
Tıpkı bir güncelleme olarak, ikinci seçeneğin bir avantajını görebiliyorum, Eclipse'de, alt modüllerin Eclipse'deki ayrı projeler olması durumunda birinci ve üçüncü örnekteki kök pom.xml'nin dahil edilmesinin zor olduğu daha kolay.
Jamie McCrindle

Yanıtlar:


166

Bence bu soruyu cevaplamak için proje yaşam döngüsü ve versiyon kontrolü açısından düşünmeniz gerekiyor. Başka bir deyişle, ebeveyn pomun kendi yaşam döngüsü var mı, yani diğer modüllerden ayrı olarak serbest bırakılabilir mi, bırakılmayabilir mi?

Cevabınız evet ise (ve bu, soruda veya yorumlarda bahsedilen çoğu projenin durumundaysa), ebeveyn pom'un VCS'den ve Maven bakış açısından kendi modülüne ihtiyacı vardır ve sonunda VCS seviyesinde böyle bir şeyle:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
`-- projectA
    |-- branches
    |-- tags
    `-- trunk
        |-- module1
        |   `-- pom.xml
        |-- moduleN
        |   `-- pom.xml
        `-- pom.xml

Bu ödeme biraz acı verici ve bununla başa çıkmak için ortak bir yol yapar svn:externals. Örneğin, bir trunksdizin ekleyin :

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks

Aşağıdaki harici tanım ile:

parent-pom http://host/svn/parent-pom/trunk
projectA http://host/svn/projectA/trunk

Bir ödeme işlemi trunksaşağıdaki yerel yapıya (desen # 2) neden olur:

root/
  parent-pom/
    pom.xml
  projectA/

İsteğe bağlı olarak, hatta bir ekleyebilir pom.xmliçinde trunksdizinde:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks
    `-- pom.xml

Bu pom.xmlbir tür "sahte" pom: asla yayınlanmaz, bu dosya asla yayınlanmadığı için gerçek bir sürüm içermez, sadece bir modül listesi içerir. Bu dosyayla, bir ödeme bu yapıya (desen # 3) neden olur:

root/
  parent-pom/
    pom.xml
  projectA/
  pom.xml

Bu "hack", bir ödeme yapıldıktan sonra kökten bir reaktör yapısının başlatılmasına ve işleri daha da kullanışlı hale getirmesine izin verir. Aslında, maven projeleri ve büyük yapılar için bir VCS deposu kurmayı seviyorum : sadece çalışıyor, iyi ölçekleniyor, ihtiyacınız olabilecek tüm esnekliği veriyor.

Cevap hayırsa (ilk soruya geri dön), o zaman sanırım # 1 deseni ile yaşayabilirsiniz (muhtemelen çalışabilecek en basit şeyi yapın).

Şimdi, bonus sorular hakkında:

  • Kaynak kontrolü, dağıtım dizinleri, ortak eklentiler vb. Gibi çeşitli paylaşılan yapılandırmayı tanımlamak için en iyi yer neresidir (Ebeveyni varsayıyorum ancak sık sık bunun tarafından ısırıldım ve daha ziyade her projede sona erdi. ortak bir).

Dürüst olmak gerekirse, burada nasıl genel bir cevap vermeyeceğimi bilmiyorum ("şeyleri karşılıklılaştırmanın mantıklı olduğunu düşündüğünüz seviyeyi kullanın" gibi). Her neyse, çocuk pompları her zaman devralınan ayarları geçersiz kılabilir.

  • Maven-release eklentisi, hudson ve nexus, çoklu projelerinizi nasıl kurduğunuzla nasıl başa çıkıyor (muhtemelen dev bir soru, çok projeli bir yapı kurulduğunda kimse yakalandıysa daha fazla)?

Kullandığım kurulum iyi çalışıyor, özellikle belirtilecek bir şey yok.

Aslında, maven-release-eklentisinin model # 1 ile nasıl başa çıktığını merak ediyorum (özellikle <parent>sürümle SNAPSHOT bağımlılıklarına sahip olamadığınız için). Bu bir tavuk veya yumurta problemi gibi geliyor ama işe yarayıp yaramadığını ve test etmek için çok tembel olduğunu hatırlayamıyorum.


Nasıl ölçeklendiğini görebildiğim için bu çok iyi. Svn: externals, hantal olmasıyla ilgili endişelerimi cevaplıyor.
Jamie McCrindle

@jamie Yararlı bulduğunuza sevindim.
Pascal Thivent

1
"Hack" in nasıl yapılacağını açıklayabilir misiniz? Sandıklar proje var ve "reaktör inşa lansmanı" ile -pl seçeneği hedef bekliyoruz ama bu yapı üzerinde bir sürüm yaparken bir sorun olarak sunuyor çünkü bu seçenek ne kök düzeyinde bir yapı geçmez release-Plugin'in <arguments /> seçeneğine yerleştirebilir miyim? Bu nedenle sürüm: Bu ... root seviyesinde pom üzerinde çalışmaya çalışması nedeniyle failes gerçekleştirmek
Oca

Svn: externals hack, uzun zamandır gördüğüm en kullanışlı svn hack'idir. Aynı depoda proje başına dallanan projelerde çok yardımcı olur.
omerkudat

1
Merhaba Pascal, Modüller bölümünde belirtilen projeler <parent> olarak değil, parent-pom'u ancak başka bir proje-parent-pom olarak kullanıyorsa sürüm # ile nasıl başa çıkacaksınız? Bu tür projelerin yapıları için hangi sürümler # alacağız (bu projelerin <parent> bölümündeki yapı sürümü VEYA bu projeleri modül olarak listeleyen Proje sürümü #)? stackoverflow.com/questions/25918593/…
AKS

34

Deneyimlerim ve Maven en iyi uygulamalarından iki tür "ebeveyn poms" var

  • "şirket" ana pom - Bu pom, şirketinize özel her pompayı devralan ve kopyalanması gerekmeyen bilgileri ve yapılandırmayı içerir. Bu bilgiler:

    • depoları
    • dağıtım yönetimi bölümleri
    • ortak eklenti yapılandırmaları (maven-derleyici-eklenti kaynağı ve hedef sürümler gibi)
    • organizasyon, geliştiriciler vb.

    Bu ana pom'u hazırlamak dikkatli bir şekilde yapılmalıdır, çünkü tüm şirket pomlarınız ondan miras alacaktır, bu nedenle bu pom olgun ve kararlı olmalıdır (ebeveyn pom'un bir sürümünü yayınlamak tüm şirket projelerinizi serbest bırakmayı etkilememelidir!)

  • ikinci tür ebeveyn pom multimodül bir ebeveyn. İlk çözümünüzü tercih ederim - bu çok modüllü projeler için varsayılan bir maven kuralıdır, genellikle VCS kod yapısını temsil eder

Niyet, büyük ölçekli bir yapıya ölçeklenebilir olmaktır, bu nedenle çok sayıda proje ve eser için ölçeklenebilir olmalıdır.

Mutliprojects ağaç yapısına sahiptir - bu nedenle bir seviye üst pom'a indirgenmezsiniz. İhtiyaçlarınız için uygun bir proje bulmaya çalışın - klasik bir örnek, mutimodule projelerinin nasıl caydırılacağıdır

distibution/
documentation/
myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml
pom.xml

Birkaç bonus soru:

  • Kaynak kontrolü, dağıtım dizinleri, ortak eklentiler vb. Gibi çeşitli paylaşılan yapılandırmayı tanımlamak için en iyi yer neresidir (Ebeveyni varsayıyorum ancak sık sık bunun tarafından ısırıldım ve daha ziyade her projede sona erdi. ortak bir).

Bu yapılandırma akıllıca bir "şirket" ana pom ve proje ebeveyn pom (s) olarak bölünmelidir. Tüm projenizle ilgili şeyler "şirket" ebeveyne gider ve mevcut projeyle ilgili olanlar projeye gider.

  • Maven-release eklentisi, hudson ve nexus, çoklu projelerinizi nasıl kurduğunuzla nasıl başa çıkıyor (muhtemelen dev bir soru, çok projeli bir yapı kurulduğunda kimse yakalandıysa daha fazla)?

Şirketin ana pom'u ilk önce serbest bırakılmalıdır. Çoklu projelerde standart kurallar uygulanır. CI sunucusu projeyi doğru bir şekilde oluşturmak için her şeyi bilmelidir.


1
Böylece iki tür ana proje / pom vardır. Biri <modüller> bildirimi olmadan. Kalıtım için kullanılan budur. Ve <multimodule> bildirimli bir üst proje. Bu, alt modüllerin miras almadığı, sadece tutma projesinin yapımını yönetmek. Haklı mıyım?
lisak

22
  1. Bağımsız bir ebeveyn, başka türlü ayrılmamış bileşenler arasında yapılandırma ve seçenekleri paylaşmak için en iyi uygulamadır. Apache'nin yasal bildirimleri ve bazı yaygın paketleme seçeneklerini paylaşmak için bir ebeveyn pom projesi var.

  2. Üst düzey projenizde javadoc'u toplama veya bir sürümü paketleme gibi gerçek bir iş varsa, o işi yapmak için gereken ayarlar ile ebeveyn aracılığıyla paylaşmak istediğiniz ayarlar arasında çakışmalar olacaktır. Sadece ebeveynlerden oluşan bir proje bundan kaçınır.

  3. Yaygın bir örüntü (şu an için # 1'i göz ardı ederek), kodlu projelerin üst öğe olarak bir üst proje kullanması ve üst düzey olarak üst öğe olarak kullanılmasını sağlamaktır. Bu, temel şeylerin herkes tarafından paylaşılmasına izin verir, ancak # 2'de açıklanan sorunu önler.

  4. Üst yapı dizin yapısı ile aynı değilse, site eklentisi çok karışık olacaktır. Toplu bir site oluşturmak istiyorsanız, bunun üstesinden gelmek için biraz uğraşmanız gerekir.

  5. Apache CXF , # 2'deki örnek bir örnektir.


2
Ibilio'ya bir göz attım ve birçok proje "bağımsız" ebeveyn pom'u tercih ediyor gibi görünüyor. Hazırda Bekletme, ActiveMQ, İskele, XStream vb. Bu, defacto mekanizması olduğunu gösterir.
Jamie McCrindle

2
Bağımsız ebeveynin bir başka dezavantajı, maven serbest bırakma eklentisinin, bir serbest bırakılmadan önce ebeveynin bir sürüme sabitlenmesini istemesi gibi görünmektedir. Muhtemelen çok fazla sorun yok çünkü ebeveyn çok fazla değişmemelidir.
Jamie McCrindle

9

Üçüncü yaklaşımla küçük bir sorun var. Toplam POM'ların (myproject / pom.xml) genellikle üst öğesi olmadığından yapılandırmayı paylaşmazlar. Bu, tüm bu POM'ların yalnızca varsayılan depolara sahip olacağı anlamına gelir.

Yalnızca Central'dan eklentiler kullanıyorsanız bu bir sorun oluşturmaz, ancak dahili deponuzdan plugin: goal biçimini kullanarak eklentiyi çalıştırırsanız bu başarısız olur. Örneğin foo-maven-plugin, groupId ile org.examplehedef belirtebilirsiniz generate-foo. Bunun gibi bir komut kullanarak proje kökünden çalıştırmayı denerseniz mvn org.example:foo-maven-plugin:generate-foo, toplama modüllerinde çalışmaz ( uyumluluk notuna bakın ).

Birkaç çözüm mümkündür:

  1. Eklentiyi Maven Central'a dağıtın (her zaman mümkün değildir).
  2. Tüm POM'larınızda depo bölümünü belirtin ( DRY ilkesini ihlal eder).
  3. Bu dahili deponun settings.xml dosyasında (~ / .m2 / settings.xml yerel ayarlarında veya /conf/settings.xml genel ayarlarında) yapılandırılmasını sağlayın. Bu ayarlar olmadan kurulum başarısız olur.
  4. Toplam POM'larınızda depo ayarlarına sahip üst öğeyi kullanın (çok fazla üst POM olabilir mi?).
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.