Neden maven? Faydaları nelerdir? [kapalı]


131

Karınca diyelim ki, maven kullanmanın temel faydaları nelerdir? Yararlı bir araçtan çok bir rahatsızlık gibi görünüyor. Düz Eclipse Java EE (m2eclipse yok) ve tomcat ile maven 2 kullanıyorum.

Maven destekçileri buna inanıyor

  1. Maven, paket bağımlılıklarınızı kolayca almanızı sağlar

  2. Maven sizi standart bir dizin yapısına sahip olmaya zorluyor

Tecrübelerime göre

  1. Paket bağımlılıklarını anlamak o kadar da zor değil. Yine de nadiren yapıyorsun. Muhtemelen proje kurulumu sırasında bir kez ve yükseltme sırasında birkaç tane daha. Maven ile, uyumsuz bağımlılıkları, kötü yazılmış pomları düzeltir ve yine de paket dışlamaları yaparsınız.

  2. Üretkenliği öldüren yavaş DÜZELTME-DERLE-ÇÖZ-DEBUG döngüsü. Bu benim ana yakınmam. Bir değişiklik yaparsınız, maven yapısının devreye girmesini ve konuşlandırılmasını beklemeniz gerekir. Hiçbir şekilde sıcak dağıtım yok.

Yoksa sadece yanlış mı yapıyorum? Lütfen beni doğru yönü göster, kulaklarım var.


1
2. nokta ile gerçekten ilgileniyorum. Yavaş düzeltme-derleme-dağıtma döngüsünü fark eden var mı? ya da herkes biliyor ama sessiz kalıyor çünkü maven elimizdeki en iyi / en yaygın / en havalı şey. Konuşlanacak bir savaş / kulak yaratmak yeterince kötü, maven durumu daha da kötüleştiriyor. Bir maven projesindeki jsp değişikliğini patlatılmış bir dizin yapısında görüntülemek makinemde 5 saniye sürüyor mu? 1 saniyeden az Birden çok kez kaydedebilirim ve yalnızca en son değişikliği maven'de derler? her kaydetme bir yapıyı tetikler.
trix

Belki maven buradaki sorun değil, ama IDE desteği / eklentisi? Bununla birlikte, bir süredir buralardayım, eğer doğru yapamazsak, başka bir şey hareket ettirmeli / icat etmeli / önermeli miyiz? yanında Ivy
trix

2
@Javid Sorunun başlığı benzer görünmekle birlikte, sorunun gövdesi farklı IMO ve ben bunu bir dupe olarak görmüyorum.
Pascal Thivent


Bir an için
NuGet

Yanıtlar:


108

Paket bağımlılıklarını anlamak o kadar da zor değil. Yine de nadiren yapıyorsun. Muhtemelen proje kurulumu sırasında bir kez ve yükseltme sırasında birkaç tane daha. Maven ile, uyumsuz bağımlılıkları, kötü yazılmış pomları düzeltir ve yine de paket dışlamaları yaparsınız.

O kadar da zor değil ... oyuncak projeleri için. Ancak üzerinde çalıştığım projelerde pek çok, gerçekten çok var ve onları geçişli olarak, onlar için standart bir adlandırma şemasına sahip olmaktan çok memnunum. Tüm bunları elle elle idare etmek bir kabus olur.

Ve evet, bazen bağımlılıkların yakınsaması üzerinde çalışmanız gerekir. Ama iki kez düşünün, bu Maven'e özgü değildir, bu bağımlılıkları kullanan herhangi bir sisteme özgüdür (ve burada genel olarak Java bağımlılıklarından bahsediyorum).

Yani Ant ile, her şeyi manuel olarak yapmanız gerekmesi dışında aynı işi yapmanız gerekir: A projesinin bazı versiyonlarını ve bağımlılıklarını kapmak, B projesinin bazı versiyonlarını ve bağımlılıklarını almak, tam olarak hangi versiyonları kullandıklarını kendiniz bulmak, kontrol etmek üst üste binmediklerini, uyumsuz olup olmadıklarını kontrol ettiklerini vb. Cehenneme hoş geldiniz.

Öte yandan, Maven bağımlılık yönetimini destekliyor ve bunları benim için geçişli olarak alacak ve bağımlılık yönetiminin doğasında bulunan karmaşıklığı yönetmem için ihtiyacım olan araçları sağlıyor : Bir bağımlılık ağacını analiz edebilir, geçişli bağımlılıklarda kullanılan sürümleri kontrol edebilir, bazılarını hariç tutabilirim onları eğer gerekli sihirli yoktur vb modüller arasında Converge kontrol ederler. Ama en azından desteğiniz var.

Ve bağımlılık yönetiminin Maven'in sunduklarının sadece küçük bir parçası olduğunu unutmayın, çok daha fazlası var (Maven ile güzel bir şekilde bütünleşen diğer araçlardan, örneğin Sonar'dan bahsetmiyorum bile ).

Üretkenliği öldüren yavaş DÜZELTME-DERLE-ÇÖZ-DEBUG döngüsü. Bu benim ana yakınmam. Bir değişiklik yaparsınız, maven yapısının devreye girmesini ve konuşlandırılmasını beklemeniz gerekir. Hiçbir şekilde sıcak dağıtım yok.

İlk olarak, neden Maven'i böyle kullanıyorsunuz? Yapmıyorum. Sürekli derlemeyi bozmayacağımdan emin olmak için, işim bittiğinde, taahhüt etmeden önce testler yazmak, geçene kadar kod yazmak, yeniden düzenlemek, dağıtmak, sıcak dağıtmak ve yerel bir Maven derlemesi çalıştırmak için kullanıyorum.

İkincisi, Ant kullanmanın işleri daha iyi hale getireceğinden emin değilim. Ve deneyimlerime göre, modüler Maven, ikili bağımlılıkları kullanarak derlemeleri, tipik monolitik Karınca yapılarına göre daha hızlı derleme süresi sağlıyor. Her neyse, Maven ortamını (yeniden) kullanmaya hazır (bu arada bu harika) için Maven Shell'e bir göz atın .

Sonunda, ve bunu söylediğim için üzgünüm, üretkenliğinizi öldüren gerçekte Maven değil, aletlerini kötüye kullanıyorsunuz. Ve eğer bundan memnun değilseniz, ne diyebilirim, kullanmayın. Kişisel olarak, 2003'ten beri Maven kullanıyorum ve hiç arkama bakmadım.


@Pascal, hangi araçları kullandığınızı söyleyebilir misiniz? IDE, eklentiler, vb. Bize bir .properties dosyasını veya bir jsp dosyasını değiştirirsem, bunun bir maven derlemesi yapmadan çalıştırılacağını mı söylüyorsunuz ? (belki sıcak dağıtım burada doğru terim değildir). Karınca ile ne demek istediğim konusunda net değildim. Geliştirme sırasında standart patlatılmış dizini kullanmayı ve yayınlanmadan önce bir savaş / kulak yaratmak için ant'ı kullanmayı kastettim. Patlatılmış bir dizin için kurallar basittir, dosyaları src'den sınıflara kopyalayın / derleyin ve geri kalanına dokunmayın.
trix

devamı ... Ancak benim projelerimde tomcat üzerine konuşlandırılan şey, modüllerin kavanozlarıdır. Bir .jsp'yi değiştirirsem, o kavanozları yeniden inşa etmek zorunda değil mi?
trix

4
Kabul etmelisiniz, çoğu proje oyuncak projeler, yani basit bağımlılıklar. Bu sadece istatistik yasası.
trix

2
@trix, sıcak dağıtım karınca ve maven hakkında: Sıcak dağıtım için karınca oluşturma yapmıyorsanız, neden aynı şekilde Maven kullanıyorsunuz? Sanırım aynı için karıncayı kullanırsanız, en az aynı süre alır ... değil mi?
Reddy

2
Yani Pascal, bize Maven doğasına göre yapılandırılmış bir projeye sahip olduğunuzu ve kurulum sürecini dağıtmak için kullanmadığınızı söyler misiniz? Bu, ilk sorunun 2. noktasıdır. Bunu nasıl yapacağımı merak ediyorum, bu yüzden bize net bir açıklama yapabiliyorsanız gerçekten minnettarım.

20

Maven, Ant gibi yalnızca geliştirme aracı değil, eksiksiz bir proje geliştirme aracı olarak düşünülebilir. Tüm sorunlarınızı çözmek için Eclipse IDE'yi maven eklentisi ile kullanmalısınız .

Maven'i kullanmanın yararları sayfasından alıntılanan Maven'in birkaç avantajı :

Henning

  • hızlı proje kurulumu, karmaşık build.xml dosyaları yok, sadece bir POM ve gidin
  • bir projedeki tüm geliştiriciler, merkezi POM nedeniyle aynı jar bağımlılıklarını kullanır.
  • "ücretsiz" bir proje için bir dizi rapor ve metrik almak
  • kaynak dağıtımlarının boyutunu azaltın, çünkü kavanozlar merkezi bir konumdan çekilebilir

Emmanuel Venisse

  • çok sayıda hedef mevcuttur, bu nedenle ANT'nin aksine belirli bir yapım süreci parçası geliştirmek gerekli değildir, mevcut ANT görevlerini inşa sürecinde antrun eklentisiyle yeniden kullanabiliriz

Jesse Mcconnell

  • Modüler kod tasarımını destekler. çoklu projeleri yönetmeyi basitleştirerek, tasarımın çoklu mantıksal parçalara yerleştirilmesine, pom dosyalarındaki bağımlılık takibinin kullanılmasıyla bu parçaların birbirine dokunmasına izin verir.
  • Modüler kod tasarımını uygular. modüler koda dudak hizmeti ödemek kolaydır, ancak kod ayrı derleme projelerinde olduğunda, bağımlılık yönetiminizde özel olarak buna izin vermediğiniz sürece kod modülleri arasında referansları çaprazlamak imkansızdır ... sadece bunu şimdi yapın ve daha sonra düzeltin 'uygulamaları.
  • Bağımlılık Yönetimi açıkça belirtilmiştir. bağımlılık yönetimi mekanizması ile jar sürümlemenizi bozmaya çalışmalısınız ... 'Bu satıcı kavanozunun hangi sürümü bu?' gibi klasik problemlerden hiçbiri yoktur. Ve mevcut bir projede kurmak, bir şeyleri başlatmak ve çalıştırmak için deponuzda 'bilinmeyen' sürümler yapmaya zorlandığınızda mevcutsa, mevcut karmaşanın tepesini koparır ... ABC.jar dosyasının gerçek sürümü.
  • güçlü tip yaşam döngüsü, bir yazılım sisteminin bir yapının başlangıcından sonuna kadar gittiği güçlü tanımlanmış bir yaşam döngüsü vardır ... ve kullanıcıların kendi yaşam döngülerini bir araya getirmek yerine, sistemlerini yaşam döngüsüyle karıştırmasına ve eşleştirmesine izin verilir. Bu, insanların bir projeden diğerine geçmesine ve yazılım geliştirme açısından aynı kelime dağarcığını kullanarak konuşmasına izin verme ek faydasına sahiptir.

Vincent Massol

  • Daha büyük momentum: Karınca artık miras ve hızlı ilerlemiyor. Maven hızla ilerliyor ve Maven çevresinde çok sayıda yüksek değerli araca sahip olma potansiyeli var (CI, Dashboard projesi, IDE entegrasyonu, vb.).

5
Aşağı oylama sırasında lütfen neden belirtin, bu söylenmeyen ancak yığın aşımı konusunda etik kuraldır.
YoK

1
Referanslarda yanlış bir şey yok ama içeriğin size ait olmadığını gerçekten açıkça belirtmeniz gerekiyor.
Pascal Thivent

Teşekkürler. Nereden kaynaklandığını belirtmek dışında alıntı yaptığımdan emin olacağım. stackoverflow'da sadece 30 garip gün geçti ve hala sanatı öğreniyorum :).
YoK

11

Küçük projeler için bağımlılıkları bulmak zor değil. Ancak, yüzlerce bağımlılık içeren bir bağımlılık ağacıyla uğraşmaya başladığınızda işler kolayca kontrolden çıkabilir. (Burada deneyimden bahsediyorum ...)

Diğer nokta ise, artımlı derleme ve Maven desteğine sahip bir IDE kullanıyorsanız (Eclipse + m2eclipse gibi), düzenleme / derleme / çalışırken dağıtma ve test etme olanağına sahip olmanız gerekir.

Kişisel olarak bunu yapmıyorum çünkü geçmişte yaşanan kötü deneyimlerden dolayı bu gelişim tarzına güvenmiyorum (Maven öncesi). Belki birisi bunun gerçekten Eclipse + m2eclipse ile çalışıp çalışmadığını yorumlayabilir.


Tüm bağımlılıkları elde etmek için maven ile başlayabilir, ardından bağımlılıkları projesine kopyalayabilir, değil mi?
trix

2
Sanırım yapabilirsin. Ancak, projenizin bağımlılıklarını güncellediyseniz veya projeniz anlık görüntülere bağlıysa, bu durum kırılabilir.
Stephen C

Demek istediğim 2 proje var, maven projesinin tek amacı bağımlılık elde etmektir. Bağımlılık güncellemeleri arasındaki değişiklikleri takip etmek için sürüm kontrolünü kullanın. Bunu yine de yapıyorum, yapımı bozması durumunda değişiklikleri görebilmek için.
trix

4
Ughh. Maven böyle kullanılmak üzere tasarlanmadı. Maven'in en büyük avantajlarından biri, bağımlı kitaplıkları sürüm kontrolü için kontrol etmekten kaçınmasıdır. Yaklaşımınızla, VCS'nizi çok sayıda ikili dosya sürümüyle karıştıracaksınız. Ve bazı VCS'ler ikili dosyaları işlemede özellikle kötüdür.
Stephen C

2
Genellikle program yazarken her tür sihirden çok yorulmanın zor yolunu öğrenirsiniz: -S
Thorbjørn Ravn Andersen

9

Maven, gerçekten beğendiğinize ve kullanmak istediğinize önceden karar vermeniz gereken araçlardan biridir , çünkü onu öğrenmek için epey zaman harcayacaksınız ve söz konusu kararı bir kez ve herkes için vermiş olmanız, her türlü şeyi atlamanıza izin verecektir. öğrenirken şüphe duymak (çünkü onu seviyorsun ve kullanmak istiyorsun)!

Maven projelerinde harikalar yaratabilen Hudson gibi, güçlü kurallar birçok yerde yardımcı olur, ancak başlangıçta görmek zor olabilir.

düzenleme: 2016 itibariyle Maven, üç büyük IDE'nin de kaynakları kutusundan çıkarabileceği şekilde kullanabildiği tek Java oluşturma aracıdır. Başka bir deyişle, maven kullanmak, yapınızı IDE'den bağımsız kılar. Bu, örneğin normalde tutulmada çalışsanız bile Netbeans profillemesini kullanmaya izin verir


1
Ve tersi o vb karınca değil çünkü, birçok insan, önyargılı nefretle maven gelmek de doğrudur
Goibniu

Tersi mi? Diyorsun ki?
Thorbjørn Ravn Andersen

9

Maven'in karıncaya göre avantajları oldukça azdır. Bunları burada özetlemeye çalışıyorum.

Konfigürasyon Üzerine Konvansiyon
Maven, proje düzeni ve başlangıcı için, bir projeye atlamayı kolaylaştıran farklı bir yaklaşım kullanır. Genellikle projenin yapıtlarını elde etmek için yalnızca kontrol noktası ve maven komutunu alır.

Proje Modülerleştirme
Proje sözleşmeleri, geliştiricinin projeyi modüler hale getirmesini önerir (veya daha iyisi, zorlar). Monolitik bir proje yerine, genellikle projenizi daha küçük alt bileşenlere bölmek zorunda kalırsınız, bu da genel proje yapısının hatalarını gidermeyi ve yönetmeyi kolaylaştırır.

Bağımlılık Yönetimi ve Proje Yaşam Döngüsü
Genel olarak, iyi bir SCM yapılandırması ve dahili bir depo ile, bağımlılık yönetimi oldukça kolaydır ve yine Proje Yaşam Döngüsü - bileşen sürümleri, sürüm yönetimi vb. Açısından düşünmek zorunda kalırsınız. Karıncadan biraz daha karmaşık bir şey, ama yine, projenin kalitesinde bir gelişme.

Maven'in nesi var?
Maven kolay değil. Oluşturma döngüsü (ne ve ne zaman yapılacağı) POM'da o kadar net değil. Ayrıca, genel depolarda bileşenlerin kalitesi ve eksik bağımlılıklar ile ilgili bazı sorunlar ortaya çıkmaktadır.
En iyi yaklaşım (benim için) bağımlılıkları önbelleğe almak (ve tutmak) için dahili bir havuza sahip olmak ve bileşenlerin sürüm yönetimine uygulamaktır. Bir kitaptaki örnek projelerden daha büyük projeler için önce veya sonra maven'e teşekkür edeceksiniz.


6

Maven, geliştirme döngünüzü hızlandırmak ve aynı zamanda daha yüksek bir başarı oranına ulaşmanıza yardımcı olmak için standart kuralları ve uygulamaları kullanarak inşa süreciniz için faydalar sağlayabilir. Maven'in geliştirme sürecinizde size nasıl yardımcı olabileceğine daha ayrıntılı bir bakış için lütfen Maven'i Kullanmanın Faydaları'na bakın.


3

Maven, POM'a (proje nesne modeli) dayalı güçlü bir proje yönetimi aracıdır. Projelerin oluşturulması, bağımlılığı ve dokümantasyonu için kullanılır. ANT gibi inşa sürecini basitleştirir. Ama ANT'den çok daha ileridir. Maven, Derlemeler, Dokümantasyon, Raporlama, SCM'ler, Sürümler, Dağıtım yönetimine yardımcı olur. - maven deposu, pom.xml dosyası içeren paketlenmiş JAR dosyası dizinidir. Maven, depolarda bağımlılıkları arar.


2

2. noktaya hiç rastlamadım mı? Bunun dağıtımı herhangi bir şekilde etkilediğini düşündüğünüzü açıklayabilir misiniz? Maven herhangi bir şey, projelerinizi modüler bir şekilde yapılandırmanıza izin veriyorsa, aslında belirli bir katmandaki hatalar için düzeltmelere izin verir ve örneğin projenin geri kalanından bir API'nin bağımsız geliştirilmesine izin verir.

Her şeyi tek bir modüle sığdırmaya çalışıyor olabilirsiniz, bu durumda sorun gerçekten maven değil, onu kullanma şeklinizdir.


Düz tutulma jee, maven 2 ve tomcat kullanıyorum. Açıkçası bir web uygulaması. Tomcat üzerindeki değişikliklerimi görmek için bir özellikler dosyasını veya bir jsp'yi değiştiriyorsam, maven derlemesini yapmalı, bir savaş / kulak oluşturmalı ve tomcat'e konuşlandırmalıdır. Bu, patlatılmış bir dizin yapısı kullanmama kıyasla yavaştır.
trix

1
Tomcat ile Eclipse altında @trix Hot deploy çalışır. Yanlış yapıyorsun.
Pascal Thivent

0

Bu bir yorum olmalıydı, ancak yorum uzunluğuna uymuyordu, bu yüzden bir cevap olarak gönderdim.

Diğer cevaplarda bahsedilen tüm faydalar, maven kullanmaktan daha basit yollarla elde edilebilir. Örneğin, bir projede yeniyseniz, yine de proje mimarisi oluşturmak, bileşenleri birleştirmek, kodlamak için kavanozları indirip lib klasörüne kopyalamaktan daha fazla zaman harcayacaksınız. Etki alanınızda deneyimliyseniz, projeye hangi kütüphanelerle nasıl başlayacağınızı zaten biliyorsunuzdur. Özellikle "bağımlılık yönetimi" ni otomatik olarak yaparken çok fazla sorun ortaya çıkardığında maven kullanmanın herhangi bir yararı görmüyorum.

Sadece orta düzeyde maven bilgisine sahibim ama size söylüyorum, maven kullanmadan büyük projeler (ERP'ler gibi) yaptım.

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.