Neden Ant veya Maven yerine Gradle kullanıyorsunuz? [kapalı]


324

Java'yı hedefleyen başka bir oluşturma aracı beni gerçekten ne elde ediyor?

Gradle'ı başka bir aracın üzerinde kullanırsanız, neden?


6
Google android sdk için Gradle ile atladı. developers.google.com/events/io/sessions/325236644 . Intellij artık gradle için destek ekledi. Bu gradle ana akış içine koyar (sadece oyuncak projeleri değil)
Jayan

Bahar eserleri artık Gradle tarafından da oluşturuldu, sanırım Hazırda Beklet aynı.
Amir Pashazadeh

Yanıtlar:


248

Gradle'ı öfke içinde kullanmıyorum (şimdiye kadar sadece bir oyuncak projesi) [yazar, Gradle'ı şu ana kadar sadece bir oyuncak projesinde kullandıkları anlamına geliyor, Gradle'ın bir oyuncak projesi değil - yorumlara bakın] , ama şunu söyleyebilirim Kullanmayı düşünmenin nedenleri Karınca ve Maven'in hayal kırıklıkları olabilir.

Benim tecrübelerime göre Ant genellikle sadece yazıyor (evet, güzel modüler, zarif yapılar yazmanın mümkün olduğunu biliyorum , ama gerçekte çoğu insan bilmiyor). Önemsiz projeler için zihin bükme haline gelir ve karmaşık yapıların gerçekten taşınabilir olmasını sağlamak için büyük özen gösterir. Zorunlu yapısı, yapılar arasında yapılandırmanın çoğaltılmasına yol açabilir (ancak makrolar burada yardımcı olabilir).

Maven tam tersi yaklaşımı benimsiyor ve Maven yaşam döngüsüyle tamamen entegre olmanızı bekliyor. Deneyimli Ant kullanıcıları, Maven, Ant'deki sahip olduğunuz özgürlüklerin çoğunu ortadan kaldırdığından özellikle sarsıcı bulurlar. Örneğin , Maven eleştirilerinin ve yanıtlarının çoğunu listeleyen bir Sonatype blogu var.

Maven eklenti mekanizması çok güçlü yapı yapılandırmalarına izin verir ve miras modeli, tüm kurumsal ve tüm projeler için yapı yapılandırmalarınızı çevreleyen küçük bir üst POM seti tanımlayabileceğiniz anlamına gelir ve tek tek projeler bu yapılandırmaları devralarak hafif bırakabilir. Maven yapılandırması çok ayrıntılıdır (Maven 3 buna hitap edeceğine söz verir) ve "Maven yolu" olmayan bir şey yapmak istiyorsanız bir eklenti yazmanız veya hacky Ant entegrasyonunu kullanmanız gerekir. Not Maven eklentileri yazmayı seviyorum ama birçok kişinin bu çabaya itiraz edeceğini takdir ediyorum.

Gradle, Ant ve Maven arasındaki tatlı noktayı vurmayı vaat ediyor. KullanırBağımlılık çözümlemesi için Ivy'nin yaklaşımını . Konfigürasyon üzerinde konvansiyona izin verir ancak birinci sınıf vatandaş olarak Ant görevlerini de içerir. Aynı zamanda mevcut Maven / Ivy depolarını akıllıca kullanmanıza izin verir.

Bu nedenle, Karınca / Maven ağrı noktalarından herhangi birine çarptıysanız ve sıkıştıysanız, muhtemelen Gradle'ı denemeye değer, ancak bence bilinmeyenler için bilinen sorunları ticarete sokmayacaksanız görülmeye devam ediyor. Pudingin kanıtı yemekte olsa da, bu yüzden ürün biraz daha olgun olana ve diğerleri herhangi bir bükülme ütülene kadar karar verirdim (bir sebepten dolayı kanama kenarı diyorlar). Yine de oyuncak projelerimde kullanacağım, Seçeneklerden haberdar olmak her zaman iyidir.


69
@Tom Gradle'ın bir oyuncak projesi olduğunu söylemiyordum, ama şimdiye kadar sadece bir oyuncak projesinde kullandım. Üzgünüz yanlış hissettim
Zengin Satıcı

18
Sleer - yaşa rağmen, yorumlarda netleştirilenleri satır içi açıklığa kavuşturmak için yazıyı düzenledim - yanlış anlama hemen yayını anti-Gradle olarak renklendirir. Gradle'ı (kendim gibi) araştıran biri başlangıçta bu cümleyi (benim yaptığım gibi) yanlış anlarsa, daha fazla okuyamayabilir veya açıklayıcı yorumu okuyamayabilir (neredeyse yaptığım gibi). Kabul etmiyorsanız / beğenmediyseniz lütfen değişikliğimi geri alın / düzenleyin.
Bert F

48
Değeri için, @RichSeller Gradle'ın oyuncak projeleri için olduğu izlenimini alamadım (parçayı köşeli parantez içinde okumadan önce bile).
Jack Leow

2
"Şimdiye kadar sadece bir oyuncak projesi" okuduğumda, yazarın Gradle'ın kendisinin bir oyuncak projesi olduğunu ifade ettiği izlenimini edindim, özellikle de "Gradle'ı kendim öfkede kullanmıyorum" kafasını karıştırdıktan sonra. Bu, yazarın öfkeyle değilken Gradle kullandığını gösterir. Sadece ilk cümleyi tekrar yazmanızı öneririm.
osa

79

Gradle birçok amaç için kullanılabilir - Ant'den çok daha iyi bir İsviçre çakısı - ancak özellikle çok projeli yapılara odaklanmıştır.

Her şeyden önce, Gradle bir bağımlılık programlama aracıdır, bu da bir programlama aracı anlamına gelir. Gradle ile kurulumunuzda herhangi bir rastgele görevi yürütebilirsiniz ve Gradle bildirilen tüm bağımlılıkların doğru ve zamanında yürütülmesini sağlar. Kodunuz herhangi bir düzende (ağaç, düz, dağınık, ...) birçok dizine yayılabilir.

Gradle'ın iki farklı aşaması vardır: değerlendirme ve yürütme. Temel olarak, değerlendirme sırasında Gradle, bakması gereken dizinlerdeki komut dosyalarını arayacak ve değerlendirecektir. Yürütme sırasında Gradle, görev bağımlılıklarını dikkate alarak değerlendirme sırasında yüklenen görevleri yürütür.

Bu bağımlılık programlama özelliklerinin üstüne Gradle, Apache Ivy ile entegrasyon yoluyla proje ve JAR bağımlılık özellikleri ekler. Bildiğiniz gibi Ivy, Maven'den çok daha güçlü ve daha az düşünülmüş bir bağımlılık yönetim aracı.

Gradle, projeler arasındaki ve projeler ile JAR'lar arasındaki bağımlılıkları tespit eder. Gradle, iBiblio biri veya kendi depolarınız gibi Maven havuzlarıyla (indirme ve yükleme) çalışır, ancak sahip olabileceğiniz diğer destek havuzu altyapısını da destekler.

Çok projeli yapılarda Gradle, hem yapıya hem de mimariye uyarlanabilir ve uyarlanabilir. Maven'de gerekli olduğu gibi yapınızı veya mimarinizi yapı aracınıza uyarlamanız gerekmez.

Gradle yoluna girmemek için çok uğraşır, Maven neredeyse hiç yapmadı. Sözleşme iyi ama esneklik de öyle. Gradle size Maven'den çok daha fazla özellik sunar, ancak en önemlisi birçok durumda Gradle size Maven'den ağrısız bir geçiş yolu sunacaktır.


64

Bu biraz tartışmalı olabilir, ancak Gradle tam teşekküllü bir programlama dili olduğu gerçeğini gizlemez.

Karınca + karınca katkı aslında kimsenin programlamak istemediği bir turing tam programlama dilidir.

Maven, tamamen açıklayıcı olmaya çalışmanın ve mantığa ihtiyacınız varsa bir eklenti yazmaya ve derlemeye zorlamanın tersi bir yaklaşımı benimsemeye çalışır. Ayrıca tamamen esnek olmayan bir proje modeli uygular. Gradle, tüm bu araçların en iyisini birleştirir:

  • Konfigürasyon üstü konvansiyonu (ala Maven) takip eder, ancak sadece istediğiniz ölçüde
  • Ant gibi esnek özel görevler yazmanıza izin verir
  • Hem Ant hem de Maven'den daha üstün çok modüllü proje desteği sağlar
  • % 80 şeyleri kolay ve% 20 şeyleri mümkün kılan bir DSL'ye sahiptir (% 80'i kolay,% 10 mümkün ve% 10'u etkili bir şekilde imkansız kılan diğer oluşturma araçlarının aksine).

Gradle, henüz kullanmam gereken en yapılandırılabilir ve esnek oluşturma aracıdır. DSL ve konfigürasyonlar gibi kavramları öğrenmek için biraz yatırım gerektirir, ancak saçma ve tamamen yapılandırılabilir bir JVM oluşturma aracına ihtiyacınız varsa yenmek zordur.


49

Gradle, her iki çerçeveden de en iyisini alarak Ant ve Maven'i güzel bir şekilde birleştirir. Ant'den esneklik ve yapılandırma, bağımlılık yönetimi ve Maven'in eklentileri üzerinde sözleşme.

Yani, maven'de olduğu gibi standart bir java derlemesine sahip olmak istiyorsanız, ancak test görevinin aşağıdaki gibi görünebilecek bazı özel adım atması gerekir.

build.gradle:

apply plugin:'java'
task test{
  doFirst{
    ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'}
  }
  doLast{
    ...
  }
}

Bunun üzerine ant / maven'in xml'sinden çok daha fazla ifade gücü veren harika sözdizimi kullanır.

Ant'in bir üst kümesidir - tüm Ant görevlerini daha iyi, harika benzeri sözdizimiyle kullanabilirsiniz.

ant.copy(file:'a.txt', toDir:"xyz")

veya

ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}

35

Gradle'ı kullanıyoruz ve Maven ve Ant'den seçtik. Ant bize tam esneklik sağladı ve Ivy Maven'den daha iyi bağımlılık yönetimi veriyor, ancak çok projeli yapılara büyük destek yok. Sonunda çoklu proje yapılarını desteklemek için çok fazla kodlama yapıyorsunuz. Ayrıca bazı konvansiyona sahip olmak güzel ve derleme komut dosyalarını daha özlü hale getirir. Maven ile, konvansiyonun çok ilerlemesini gerektirir ve inşa sürecinizi özelleştirmek bir hack olur. Ayrıca Maven, bir eser yayınlayan her projeyi teşvik ediyor. Bazen alt projelere bölünmüş bir projeniz olur, ancak tüm alt projelerin birlikte oluşturulmasını ve sürümlendirilmesini istersiniz. Maven'in tasarladığı bir şey değil.

Gradle ile Ant'in esnekliğine sahip olabilir ve Maven kongresiyle inşa edebilirsiniz. Örneğin, geleneksel yapı yaşam döngüsünü kendi görevinizle uzatmak önemsizdir. Ve eğer istemiyorsanız bir konvansiyon kullanmak zorunda değilsiniz. Groovy kodlamak XML'den çok daha hoş. Gradle'da yerel dosya sistemindeki projeler arasındaki bağımlılıkları, her biri için bir depoda yapay öğeler yayınlamaya gerek kalmadan tanımlayabilirsiniz. Son olarak, Gradle Ivy kullanıyor, bu yüzden mükemmel bir bağımlılık yönetimi var. Benim için şimdiye kadar tek dezavantajı, olgun Eclipse entegrasyonunun olmaması, ancak Maven için seçenekler gerçekten daha iyi değil.


2
Şahsen, Eclipse entegrasyonunun iyi olduğunu düşünüyorum. Juno'ya kurmak oldukça basit.
djangofan

1
2 yıl sonra yazar bu yanıtı yazdı!
Dennis

21

Bu benim cevabım değil , ama kesinlikle benimle yankılanıyor. Bu geliyor Ekim 2012'den THOUGHTWORKS' Teknoloji Radar :

Ant ve Maven gibi XML tabanlı oluşturma araçlarıyla iki şey yorgunluğa neden oldu: çok fazla kızgın sivri diş teli ve eklenti mimarilerinin kabaluğu. Sözdizimi sorunları nesil boyunca ele alınabilirken, eklenti mimarileri, projeler daha karmaşık hale geldikçe oluşturma araçlarının zarif bir şekilde büyümesini ciddi şekilde sınırlar. Eklentilerin yanlış soyutlama seviyesi olduğunu hissettik ve bunun yerine Gradle ve Rake gibi dil tabanlı araçları tercih ettik, çünkü daha ince taneli soyutlamalar ve uzun vadede daha fazla esneklik sunuyorlar.


16

Gradle eğlenceyi bina / montaj yazılımına geri koydu. Tüm kariyeri boyunca yazılım oluşturmak için karınca kullandım ve her zaman geliştirici çalışmanın gerçek "yapı" kısmını gerekli bir kötülük olarak gördüm. Birkaç ay önce şirketimiz ikili bir depo kullanmamadan bıkmıştı (diğer bir deyişle kavanozlara vcs içine kontrol etmek) ve bana bunu araştırmak için görev verildi. Sarmaşık ile başladı çünkü karınca üstüne cıvatalı olabilir, inşa ettiğim eserlerimi istediğim gibi yayınlamak için çok şansım yoktu. Maven için gittim ve xml ile hackledim, bazı basit yardımcı kütüphaneler için görkemli çalıştım ama konuşlandırılmaya hazır uygulamaları paketlemeye çalışırken ciddi sorunlarla karşılaştım. Eklentileri gezerken ve forumları okurken oldukça uğraştım ve kullanmakta zorlandığım çeşitli eklentiler için trilyonlarca destek kavanozunu indirdim.

Ama ilk günden itibaren ruh halim gelişmeye başladı. Bir yere gidiyordum. İlk karınca modülümü taşımak için iki saat sürdü ve derleme dosyası temelde hiçbir şey değildi. Kolayca monte edilen bir ekran. Büyük "vay" şuydu: xml'de komut dosyaları oluşturmak , bu ne kadar aptalca? bir bağımlılık beyan etmenin BİR satır alması benim için çok cazip geliyor -> belirli bir proje için tüm bağımlılıkları tek bir sayfada kolayca görebilirsiniz. O zamandan beri sürekli bir rulodaydım, şimdiye kadar karşılaştığım her sorun için basit ve zarif bir çözüm var. Bunun nedenleri olduğunu düşünüyorum:

  • groovy, java geliştiricileri için çok sezgisel
  • dokümantasyon harikadan müthişe
  • esneklik sonsuz

Şimdi günlerimi yapım sürecimize eklemek için yeni özellikler düşünmeye çalışıyorum. Bu ne kadar hasta?


+1 için "xml'de script oluşturma , bu ne kadar aptalca?" 2000 yılında XML, şimdiye kadarki en havalı şey olarak kabul edildi, bu yüzden tüm adalette, o zamanlar aptaldan daha modaya uygun görünüyordu. XML tabanlı programlama dilleri temelde lisps'tir çünkü her komut için açma / kapama sınırlayıcılarına sahiptirler. Ancak 4 kod kodunun 40 karakter haline geldiği lisp'in süper ayrıntılı versiyonlarıdır. Nasıl yazacağını öğrenmenin bir yolu, ama benim fincan çayımı değil.
GlenPeterson

8

Yerel yapıları yönetmek de çok daha kolay. Ant ve Maven etkili bir şekilde sadece Java özelliğine sahiptir. Maven için bazı yerel projeleri ele almaya çalışan bazı eklentiler var, ancak etkili bir iş yapmıyorlar. Yerel projeleri derleyen karınca görevleri yazılabilir, ancak çok karmaşık ve gariptirler.

JNI ve diğer birçok yerel bit ile Java yapıyoruz. Gradle, Karınca dağınıklığımızı önemli ölçüde basitleştirdi. Yerel projelere bağımlılık yönetimi getirmeye başladığımızda dağınıktı. Maven'i bunu yaptık, ama eşdeğer Gradle kodu Maven'de ihtiyaç duyulanın küçük bir kısmıydı ve insanlar Maven gurusu olmadan bunu okuyabilir ve anlayabilirdi.


3

Kısmen Ed Staub'a katılıyorum. Gradle kesinlikle maven ile karşılaştırıldığında daha güçlüdür ve uzun vadede daha fazla esneklik sağlar.

Maven'den gradle'a geçmek için bir değerlendirme yaptıktan sonra, gradle ile karşılaştığımız iki sorun için kendini maven'e sadık kalmaya karar verdik (hız maven'den daha yavaş, proxy çalışmıyor).


V1.2 ile proxy sorunları yaşadım ama o zamandan beri çalıştığını düşünüyorum. O kadar ki, ctnlm veya bunun gibi bir uygulama maven için NTLM proxy sorunlarını çözmek için bir çözümdür. Gradle bu desteği kutudan çıkarır. Bu çok önemsiz olmasına rağmen, Maven'in neden NTLM kimlik doğrulama tabanlı proxy'ler için bu desteği hiç kullanmamış olduğunu merak ediyorum.
skipy
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.