Maven Modülleri + Tek bir Modül Oluşturma


383

Bir ebeveyn projesi ile bir çok modül Maven projesi var Pve üç alt modüllere A, Bve C. Hem BveC savaş projeler ve her ikisi de bağlıdır A.

Ben yazabilirsiniz mvn compileiçindeP ve düzgün derlenmiş alt modüllerin hepsi var. Sorun, belirli modüller için işlemler yapmak istediğimde geliyor.

Proje için bir savaşı paketleyebilmek istiyorum B, ancak paket komutunu Bdizininden çalıştırdığımda, bunun için bağımlılıkları bulamadığından şikayet ediyorA .

Bu sorudan anlıyorum: Belki de Maven'in bu tür bağımlılık çözümü için gerçekten tasarlanmadığı maven ve bağımlı modüller , ancak nasıl paketleyeceğimi soruyorB ?

  1. Ben yayınlamak zorunda mıyım mvn packageben gerçekten sadece istediğinizde bütün proje hiyerarşisi içinB ?

  2. Her paketlemek istediğimde A'nın anlık görüntülerini yerel veri havuzuma kurmam gerekir Bmi?

Bu ikinci senaryo, A hala aktif geliştirme aşamasındayken .

Burada en iyi uygulamalar var mı?


Yanıtlar:


694

Burada en iyi uygulamalar var mı?

Maven gelişmiş reaktör seçeneklerini , daha spesifik olarak kullanın:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Sadece cdüst P dizinine gidin ve çalıştırın:

mvn install -pl B -am

Ve bu B'yi ve B'nin gerektirdiği modülleri inşa edecektir.

artifactIdDizin adından farklı bir noktaya başvuruyorsanız iki nokta üst üste işaretini kullanmanız gerektiğini unutmayın :

mvn install -pl :B -am

Burada açıklandığı gibi: https://stackoverflow.com/a/26439938/480894


15
2011 yılında bu sayfaya isabet eden herkes için bu daha iyi bir yanıttır. Maven'in içindeki çoklu modüller için daha iyi destek var (Maven 2.1 ve üstü), reaktör eklentisini kullanmanıza gerek yok.
Spedge

17
Diğer bir çok kullanışlı seçenek de, reaktör listesindeki projelere bağlı tüm modülleri oluşturan "-amd, --ayrıca bağımlılar" dır.
deterb

1
Bir torun modülü oluşturmaya ne dersiniz?
Bax

12
@Bax, mvn install -pl .,parent/child,parent/child/grandchild birden çok projeyi ayırmak için virgül kullanın ve. ebeveyn pom için
Neo

1
clean packageBu şekilde bir modüle çalıştığımda , henüz kurulmamış reaktör bağımlılıklarını çözemez. Bununla -ambirlikte gereksiz yere tekrar inşa edecek.
havza

18

Parent pom.xml dosyasının 6 modül içerdiğini ve A , B ve F'yi çalıştırmak istediğinizi varsayalım .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- Ana projeye cd

 mvn --projects A,B,F --also-make clean install

VEYA

mvn -pl A,B,F -am clean install

VEYA

mvn -pl A,B,F -amd clean install

Not: -am seçeneğiyle bir proje belirttiğinizde Maven, belirtilen projenin bağlı olduğu tüm projeleri (doğrudan veya dolaylı olarak) oluşturur. Maven, proje listesini inceleyecek ve bağımlılık ağacından aşağı inerek inşa etmesi gereken tüm projeleri bulacaktır.

-Am komutu çok modüllü bir yapıda belirli bir projenin gerektirdiği tüm projeleri yaparken, -amd veya --also-make-dependsents seçeneği Maven'i bir proje ve bu projeye bağlı herhangi bir proje inşa edecek şekilde yapılandırır. -Ayrıca marka-bağımlıları kullanırken Maven, belirli bir projeye bağlı olan projeleri bulmak için reaktörümüzdeki tüm projeleri inceleyecektir. Bu projeleri otomatik olarak inşa edecek ve başka hiçbir şey yapmayacak.


8

Maven kesinlikle bu tür bir bağımlılık için tasarlandı.

mvn package yerel deponuza hiçbir şey yüklemez, sadece projeyi paketler ve hedef klasörde bırakır.

Yapmak mvn install Bu tüm alt modüller, bilgisayarınızın Maven depo kurulacak olan, ana proje (A) sadece / derleme alt modülü paketlemek (B) ve Maven'in zaten paketlenmiş alacak gereken hiçbir değişiklik varsa ve kurulu bağımlılıklar doğru.

mvn installKodun bir kısmını güncellediyseniz sadece ana projede bir tane yapmanız gerekir .


3
Geliştirme sırasında bir kabus olurdu, görüntü alt modülde bir düzeltme yaptıktan sonra onu kurmuş olacaksınız ve ardından sunucu uygulaması kabını başlatmış olacaksınız. Hayat kısa :(
hguser

7

Daha önce proje B'de mvn install komutunu çalıştırdıysanız , yerel deponuza yüklenmiş olacak, bu nedenle A Maven paketini oluşturduğunuzda bağımlılığı çözebilirsiniz. B projesini her değiştirdiğinizde yüklediğiniz sürece, A projesine yönelik yapılarınız güncel olacaktır.

Bir dizi proje oluşturmak için toplayıcı pom ile çok modüllü bir proje tanımlayabilirsiniz.

Ayrıca m2eclipse'den bahsetmeye değer , Maven'i Eclipse'e entegre eder ve (isteğe bağlı olarak) çalışma alanından bağımlılıkları çözmenize izin verir. Bu nedenle, birden fazla projeye saldırıyorsanız, çalışma alanı içeriği derleme için kullanılacaktır. Değişikliklerinizden memnun olduğunuzda, yerel deponuza koymak için mvn install (sırayla her projede veya bir toplayıcı kullanarak) çalıştırın.


1
Hedef projem için tüm bağımlı projelerin kurulduğunu garanti etmenin kolay bir yolu var mı? Sahip olduğum hiyerarşi aslında burada açıklanandan çok daha karmaşık, bu yüzden en son yaptığım kod değişiklikleri zor olabileceğinden, her bağımlı proje için mvn install çalıştırıp çalıştırmadığımı hatırlamaya çalışın.
Brian Ferris

Evet, proje setini oluşturmak için modülleri kullanarak orijinal cevaba eklenen bağlantıya bakın.
Rich Seller


3

"Gerçekten sadece B istiyorsun" diyorsun, ama bu yanlış. B'yi istiyorsunuz, ancak üzerinde herhangi bir değişiklik yapılmışsa güncellenmiş bir A da istiyorsunuz ("aktif gelişme").

Bu nedenle bazen sen A ve B ile çalışmak istiyorum (ama nereye durum için toplayıcı projeyi P. sahip bu durum için A, B, ve C ile çalışmak isteyen yok C istiyorum), sen toplayıcı proje Q oluşturmalıdır .

2016'yı düzenle : Yukarıdaki bilgiler belki de 2009 yılında konuyla ilgiliydi. 2016 itibarıyla, çoğu durumda bunu göz ardı etmenizi ve sadece kabul edilen cevapta açıklandığı gibi -amveya -plkomut satırı bayraklarını kullanmanızı tavsiye ederim . V2.1'den önceki bir maven sürümünü kullanıyorsanız, önce bunu değiştirin :)


Grmphh ... o zaman proje kadar toplayıcı projeyle sonuçlanacağım.
Kris

@Kris Artık bunu tavsiye etmem. Birisinin hala nasıl olduğunu bilmek istemesi durumunda burada bırakacağım, ama şimdi -am ve -pl bayraklarını kullanıyorum. Cevabımı güncelledim.
Zac Thompson
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.