Çok modüllü bir Maven projesi oluşturmak için büyük bir projeyi bölmek


23

Maven'i bağımlılık yönetimi için kullandığımız Spring-MVC uygulaması üzerinde çalışıyorum. Proje büyük olduğu için projeyi birkaç bölüme ayırmayı düşünüyoruz. Bazı şüphelerim vardı, umarım burada cevaplar alırım.

Şu anda, ROOT.warsunucumuzdaki Apache tomcat'ta olduğu gibi tek bir WAR dosyası dağıtıyoruz . Proje büyük olduğu için web uygulamasında Bildirimler ve E-posta, Üçüncü taraf hizmetleri, PUSH (Cometd), REST API'sı, vb. Gibi bölümler var. Örneğin, Notificationnesneler ayrıca PersonBildirimler kullanıcılar için uyarlandığı için nesneye de bağlıdır .

Büyük projeyi bölmenin asıl amacı bireysel modüller üzerinde, hata düzeltmeleri, özellikler, testler vb. İçin çalışabilmektir. Tatmin olunca, bu uygulama sadece uygulama yerine sunucuda değiştirilebilir. Mümkün mü?

Daha önce de bahsettiğim gibi, nesneler arasında bağımlılıklar ve eşlemeler var. Bunlar farklı alt modüller arasında nasıl yönetilecek, yoksa sadece ithalat ifadeleri diğer projeleri içerecek şekilde değişecek mi?

Dediğim gibi, amaç tek tek modüller üzerinde çalışmak ve onları dağıtabilmek (tercihen sıcak). Şu anda, sadece tek bir WAR dosyamız var ROOT.war. Bölme işlemi, daha sonra URL olarak adlandırılan çoklu savaş dosyaları oluşturur mu?domain-name.com/module_name/some_mapping

Şu anda belgeleri kontrol ediyorum, ancak bu Maven tarafından sağlanan ve bunun mümkün olup olmadığını bilmekle ilgili çoklu modül ile ulaşmak istediğimiz temel amaç. Daha fazla bilgi gerekirse, lütfen bana bildirin.

Şu anda ilkbahardan bir ana POM kullanıyorum:

<parent>
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>1.1.3.RELEASE</version>
    <relativePath />
</parent>

1
Cevaplaması için başkalarına bırakıyorum. Fikir çok sağlam. Bağımlılık yönetimine sahip bir ebeveyn POM'u ve Kişi gibi DAO'lar için bir kavanozla başlayabilirsiniz. Çok basit bir kütüphane. Ve bunun gibi. Elbette döngüsel bağımlılık yok.
Joop Eggen

Yanıtlar:


20

Mümkün mü ?

Evet kesinlikle. Geçmişte bu yapıya sahip birkaç projem var, işte size biraz umutla başlamanızı sağlar.

Maven'i bir araya getirmek için kullanacağınız iki ana özelliği var:

Bölmek ve fethetmek

Projelerinizi birden fazla bağımsız projeye bölmeniz gerekecek. Burada bağımsız olarak, proje dışındaki koda yapılan tüm referansların Maven'deki bağımlılıklar yoluyla yapıldığını ve doğrudan kaynak ağacın birleştirilmeden yapıldığını kastediyorum.

Kaynak ağacınızın durumuna bağlı olarak bu bir çok işi temsil edebilir. Bu, Maven’e ayakkabı bağı yapmak için değil, kod temelinizi yapılandırmak ve sterilize etmek için bir araç olarak yaptığınızı söyledi. Bunu bir şey buldukça düşünün, burada bir şeyleri bulmak çok daha kolay:

Güzel araçlar

buradan:

Çok hoş olmayan bir takım

Maven yoğun bir şekilde kongre konusuna güveniyor, bu yüzden eşyalarını ne kadar iyi organize edersen o kadar çok Maven sana yardım edebilir. Bu, kendi konvansiyonuna daha iyi uyması için yeniden organize olmanızı gerektirebilir ve burada bir tavsiye vermek zorunda kalırsam, Maven'in sözleşmelerine uyacak şekilde eşyalarınızı değiştirmenin, Maven'i denemek ve yapılandırmaktan çok daha kolay olduğu söylenebilir. konvansiyonunu anlayın.

Bu projeler ana uygulamanın dışında kullanılabiliyorsa, gerçekten bağımsız kütüphaneler olarak yaşayabilir ve maven bağımlılıklarına dahil olabilir. Kendi havuzlarında (uygulama kaynak ağacında değil) yaşamalı ve ana uygulamanın herhangi bir bölümüne bağlı olmamalıdır.

Uygulamanızın temel bölümleri, projelerde bölündükten sonra modül olarak bir araya getirilebilir. Genellikle bunları uygulamanızın ana kaynak klasörünün alt klasörü olarak yerleştirirsiniz.

Ayrıca, uygulamanız için ebeveyn POM modül bildirimi içerecektir. Ayrıca, uygulamanız için tüm genel bağımlılıkları oraya yerleştirecek, ayrıca yapı eklentilerinin ve yapılandırmalarının çoğunu beyan edeceksiniz. Burada ayrıca, modüllerde tekrar kullanabileceğiniz uygulamanın sürümü gibi şeyler için bir grup özellik yerleştirmenizi şiddetle tavsiye ediyorum. Her şey aynı sürüme sahip olduğunda ve sürüme bir yerde sahip olmak yönetimi çok daha kolay hale getirir.

İşleme

1'den büyük bir takımsanız, Maven bağımlılıklarınız için bir depo kurmanızı şiddetle tavsiye ederim. Bak Artifactory , Nexus veya Archiva . POM dosyasını doğrudan bunlara kurması için yapılandırabilirsiniz, bu yüzden çalıştırdıktan sonra yükü fazla kalmamalı, ancak doğru yerde olan doğru kavanoza bağımlılıkları çözerek ekibinize zaman kazandırır.

Takım oluşturma konusunda bir sonraki mantıksal adım, sürekli bir entegrasyon sistemidir ( Jenkins , daha birçokları vardır). Testleri yürüten ve yapay zemine iten kaynak yapımını ele alacaktır, tüm bunların olduğu yerde yapmanız gereken tek şey kodu çalışmaktır ve gerisi sadece çalışır.

Uygulamanızı bir savaş maveni olarak paketlediğiniz için savaşın üstesinden gelebilir ve jar dosyalarını veya başka benzer işleri birleştirmek zorunda kalmadan tüm bağımlılıkları uygun yerlerine koyabilir , o yüzden endişelenmenize gerek yoktur.

Örnek

Burada daha uzun sürebilirim ama hiçbir şey iyi bir örnek olamaz. Benzer büyüklükteki projeler için github'a bakın ve pom dosyalarını ve klasör hiyerarşilerini nasıl oluşturduklarını görün. Birden fazla bak, bazı hiçbiri gerçekten enkarne, diğerlerinden daha iyi Ayarlarınızı uyacak gerçeği ama bunu halletmek için nasıl düşüncelerinizi yakıt için yeterli bulmalıdır.

Örneğin, Jenkins'i ele alalım:

Onların görebilirsiniz ebeveyn POM oldukça geniş.

Bu bölümde gördüğünüz gibi modüller kullanıyorlar:

<modules>
    <module>core</module>
    <module>war</module>
    <module>test</module>
    <module>cli</module>
</modules>

Ve her modül aynı zamanda POM içeren aynı isimde bir alt klasöre karşılık gelir. İstediğiniz kadar iç içe geçirebilirsiniz, ancak bunu akıl sağlığı düzeylerinde tutarsınız;).

Küçük başla

Eğer Maven'i hiç kullanmadıysanız, derim ki, derhal modüllerle başlamamanız. Yavaş ol, başla, sahip olabileceğin en basit kütüphanelerden birini söyle ve onu bir maven projesi yap. O zaman ana uygulamanızı basit bir maven projesi yapın. Bu işe yaradığında, basit bağımlılıklar eklemeye başlayın, ardından ilk modülünüzü ve benzeri şeyleri bölün.

Maven harika bir araçtır, fakat özellikle işler yolunda gitmediğinde, boynunuzda süper bir ağrı olabilir. İlk seferinde bütün sarhoşluktan başlamak, felaket için bir karşılıktır (benim içindi!).

İşler biraz garipse, mvn help:effective-pomMaven'in gerçekte ne anlama geldiğini görmek için her zaman komutu kullanabilirsiniz .

eklentileri

Yorumunuzdan ne elde etmek istediğinizi daha iyi anlıyorum. Bu durumda, eklentiler yaklaşımı için giderdim. Çalışmayı izole etmek istediğiniz uzatma noktalarının API'sini gösteren bir proje oluşturun. Sonra bunu uygulayacak olan yeni bir projede bağımlılık olarak kullanabilirsiniz. Ana uygulamanızda, sadece bu uygulamalar için uygun bağımlılıkları ekleyin (bu sefer maven modüllerini kullanmıyorsunuz) ve gitmeniz iyi olur. Sonunda ana uygulama projesi dış projelerde yapılan ve bağımlılıklarla yüklenen her şeyin neredeyse hiçbir kaynak kodunu taşımayacaktır.

Ancak bu uygulamanın tamamı, çekirdeklerin değişip değişmediğine bakılmaksızın, savaşın bağımlılıklardan statik olarak inşa edilmiş olup olmadığına bakılmaksızın, tüm başvuruyu yeniden dağıtmanız gerekecektir. Gerçekte olduğundan daha kötü sesler, Aslında sadece yeni değişiklikler gerçekten inşa edilecek, geri kalanı temelde önceki kavanozların bir kopyası olacak. Ancak her şey savaş dosyasında olduğu için yeniden inşa edilmesi gerekecek ve sunucunun durdurulması ve yeniden başlatılması gerekecek.

Eğer daha ileri gitmeye ihtiyacınız varsa, imkansız olmasa da, işler biraz daha karmaşıklaşacaktır. OSGI'ya bakmanızı tavsiye ederim, Apache Felix de başlatabilir , ancak başka uygulamalar da var. Bu, dış kavanozdan almanızı ve uygun eklentiler haline getirmenizi sağlar. Dinamik yeniden yükleme ve güncelleme işlemleri için kapıyı açan bileşenlerin çalışma ömrü boyunca daha fazla kontrol sahibi olacaksınız. Bununla birlikte, çekirdeğinizde büyük değişiklikler yapılması gerekecek, muhtemelen iyi bir başlangıç ​​noktası değil. Ancak, iyi ayrılmış bir projeniz ve tüm parçaların istediğiniz gibi izole edilmesini sağladıktan sonra, güncellemeyi başlatmak için uygulamayı başlatmak ve durdurmak önemli bir sorundur.

Modüller ve bağımlılıklar arasındaki temel fark şudur:

  • Modüller, ideal olarak alt klasörler olarak ana uygulama ile aynı kaynak ağacında yaşar.
  • Bağımlılıklar herhangi bir yerde olabilir.

İncil'i burada bulabilirsiniz .

Umarım bu yardımcı olur, iyi şanslar.


Aslında kaynak ağacı yerine maven aracılığıyla modüllerin birleştirilmesi, sahip olduğum birçok soruyu çözdü. Lütfen bana böyle bir projenin yayılmasından bahseder misiniz? Düşünmemizin diğer sebeplerinden biri, geliştiricilerin gerekli modül üzerinde çalışabilmesi ve değişiklikleri gerçek zamanlı yapabilmesidir. Kaçınılmasını istediğimiz bir şey, uygulama sunucusunu durdurmak ve çekirdek modül dışında başka bir yerden başlamak. 2 modül olarak düşünebildiğim, sıklıkla değişen kod içerecektir. Tomcat'ı Apache tarafından yük dengelenmiş bir uygulama sunucusu olarak kullanıyoruz. Teşekkür ederim.
Borg

Maven modülleri genellikle ana uygulama ile aynı kaynak ağacına oturur. Kaynak ağacın dışında maven modüllerini kullanmak, aslında gerçekten olduğundan daha karmaşık. Projeleri kaynak ağacın dışında barındırıyorsanız, normal bağımsız projeler için gidin ve normal bağımlılıkları kullanın.
Newtopian

Projemizin bir bölümünü doğrudan Maven bağımlılığı olarak eklemek için gideceğimizi düşünüyorum. Bu şekilde doğrudan projenin bölümleri üzerinde çalışabiliriz. Yaptığım tek bir soru, eğer alt projelerden birini POM.xml dosyasına bağımlılık olarak eklersek, 2.0.0 sürümünü söylersek, ve sonra bazı değişikliklerle, modülün 2.0.1'ini sonatip'e zorlayabiliriz, nasıl yapabiliriz? doğrudan çekirdek-modüle 2.0.1'e gitmesini söyleyin, sadece ROOT.war içindeki POM.xml dosyasını değiştirmek ve ROOT dizinini silmek yeterli olacaktır. Asıl amaç sunucuyu durdurmak değil. Teşekkür ederim.
Biz Borg

Savaş oluşturulduktan sonra pom.xml'in hiçbir ilgisi yoktur, yani Tomcat (ya da hangi kabı kullanıyorsanız) bu dosyayı kullanmaz. Dosya, Maven tarafından sırayla sunucuya dağıtmanız gereken yeni bir savaş dosyası oluşturmak için kullanılır. Böylece, döngü kod üzerinde çalışır, bir jar dosyası oluşturur, savaşın POM'undaki sürümü güncelleyin, bir savaş dosyası oluşturun, sunucuyu yeni savaş dosyası ile güncelleyin. Bazı sunucular, uygulamanın birkaç saniyeliğine kapatılması anlamına gelse de, yeniden devreye alma işlemlerini destekleyecektir.
Newtopian
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.