Her projenin artık olmazsa olmazı olan Maven için yöneltilen; “Ne için yapıldı?”, “Neden kullanılır?”, “Faydaları nelerdir?” sorularına cevap olarak bir makale yazmak istedim. Bu işin en başına gidelim, 2000′ li yıllara ve Maven’in doğuşuna bakalım.
Apache Ant, yazılım inşa süreçlerini(build process) otomatikleştirmeye yarayan bir araçtır. Make‘e benzeyen uygulama, Java ile geliştirilmiş olup, Java projelerinde sıkça kullanılmaktadır. Apache Ant, James Duncan Davidson‘ın bir Sun ürününü açık kaynak kodlu bir yazılıma dönüştürmeye çalışması sonucu ortaya çıkmıştır. Ürünün adı İngilizce “Another Neat Tool” (Bir Başka Harika Araç) sözünün kısaltmasıdır. Ant, bir XML “inşa dosyası“ndaki (build.xml) yönergeleri kullanarak Tomcat’i inşa etmek üzere kullanımı kolay bir arayüzle hazırlanmıştır. Bu sessiz başlangıcın ardından Ant zaman içinde gelişerek, Tomcat dışındaki ürünlerin inşasına da izin vermeye başlamıştır. Ant’in 1.1 sürümü, 19 Temmuz 2000 tarihinde bağımsız bir ürün olarak piyasaya sürülmüştür. Ant, bugün geliştirilen çoğu Java projesinde inşa aracı olarak kullanılmaktadır.
Ant ve Make arasındaki en belirgin fark, Ant’in inşa süreci ve bağımlılık tanımları için XML kullanmasıdır. XML dosyasının adı build.xml’dir. Make ise kendine özgü dosya biçimi olan Makefile’ı kullanır.
Apache, Jakarta Turbine projesindeki (Web uygulamaları geliştirme konusunda kolaylık sağlayan servlet tabanli bir framework) inşa süreçlerini(build processes) basitleştirme girişiminde bulundu. Kendi Ant build dosyalarına sahip olan ve birbirinden çok da farklı olmayan projeler vardı. Bu projelerdeki JAR’lar CVS tarafından kontrol edilirdi. Projeleri build etmenin standart bir yolunu, projenin nelerden oluştuğunun açık bir tanımını yapmak için, proje bilgilerini yayınlamanın kolay bir yolunu ve JAR’ları çeşitli projelerde paylaşmanın bir yolunu aramaya başladılar.
Maven Nedir ?
Maven, Yidiş dilinde “Bilginin Birikimi” anlamına gelmektedir. Proje bağımlılık yönetim aracıdır. Hatta ben direk kendisine “Proje Yöneticisi” diyorum. Ant’a bir alternatif olarak gösterilen aynı Ant gibi bir JDT(Java Development Tool) ‘dur. Versiyonlarına baktığımızda 30 Mart 2002′ de ilk versiyonun çıktığını görüyoruz.(http://maven.apache.org/docs/history.html)
Maven’in Amaçları Nelerdir ?
- Projenin geliştirme adımlarını kolaylaştırmak
- Standartlaştırma
- Projenin niteliklerini bilgi olarak sağlamak
- Tekrar kullanılabilirlik
- Kararlılık
- Bağımlılık yönetimi
- Ölçeklenebilirlik
Ne işe yarar bu Maven?
Maven, proje geliştirirken proje içerisinde bir standart oluşturmamızı, geliştirme sürecini basitleştirmemizi, dokümantasyonumuzu etkili bir şekilde oluşturmamızı, projemizdeki kütüphane bağımlılığını ve IDE bağımlılığını ortadan kaldırmamızı sağlayan bir araçtır.
POM Nedir ?
Proje Nesnesi Modeli (Project Object Model) veya POM, Maven’deki temel iş birimidir. Proje kurmak için Maven tarafından kullanılan proje ve yapılandırma detayları hakkında bilgi içeren bir XML dosyasıdır.
POM, Maven 1’deki project.xml’den Maven 2’de pom.xml’ye dönüştürüldü. Bir görevi veya hedefi yürütürken; Maven, geçerli dizinde POM’u arar. POM’u okur, gerekli yapılandırma bilgisini alır, sonra hedefi yürütür.
POM’de belirtilebilecek bazı yapılandırmalar proje bağımlılıkları, çalıştırılabilecek eklentiler veya hedefler, yapı profilleri, proje sürümü, açıklama, geliştiriciler, posta listeleri ve benzerleri gibi diğer bilgiler de belirtilebilir.
Maven’in faydaları nelerdir ?
Maven, proje kalıpları(pom.xml) sayesinde IDE bağımlılığı olmadığından dolayı kurulumda esneklik sağlar. Yeni bir proje oluşturacağınızda Maven proje kalıplarını kullanabilirsiniz, bu kalıplar birer standart haline geldiği için tüm IDE ‘lerde desteklenmektedir.
Projede kullanılacak tüm kütüphaneler ve eklentiler POM(Project Object Model) dosyasından kolayca yönetilebilmektedir. Maven, kütüphane dosyalarını kendi repository sunucularında barındırır. Projede kullanmak istediğiniz kütüphane dosyalarını ilk olarak sizin local repository klasörünüzde arar, eğer bulamazsa kendi sunucularında arama yapar, eğer kendi sunularında da bulamazsa sizin tanımlayacağınız bir sunucu adresinden dosyayı sizin local klasörünüze indirir ve projeniz içerisinde kullanabilmenizi sağlar. Ayrıca bir kütüphane başka kütüphanelere bağımlıysa bu bağımlı olduğu kütüphaneleri de indirir ve projenize ekler.
Projenizin build ya da deploy yapılandırmalarını POM dosyasından yönetebilirsiniz. Büyük çaplı bir projenin, farklı sunucu sistemlerinde ya da farklı veri tabanlarında eş zamanlı olarak çalışması gerekebilir. Bunun için her güncelleme sırasında farklı yapılandırma ayarlarıyla bu sistemleri güncellememiz gerekir. Her sistem için yapılandırma dosyalarını baştan düzenlemek oldukça yorucu bir iş. Ancak POM dosyasında tanımlanacak yapılandırma ayarları işimizi görecektir. Sadece yapılandırma adını değiştirerek proje çıktısını farklı sistemlere uygun hale getirebilirsiniz.
Sürüm yönetimi, her Maven projesinin bir grup id ‘si, bir yapı id ‘si ve bir de sürüm numarası vardır. Projenin farklı sürümlerini saklayabilir ve bunları daha sonra yeni projelerde kullanabiliriz.
Ant ile arasındaki farklar nelerdir ?
Ant da ortak bir proje dizini yapısı gibi resmi kurallara sahip değilsiniz, kaynağı nerede bulacağınızı ve çıktıyı nereye koyacağınızı tam olarak söylemek zorundasınız.
Ant, prosedüreldir. Tam olarak ne yapacağını ve ne zaman yapacağını söylemelisiniz. Derlemeyi, sonra kopyalamayı, sonra sıkıştırmayı … Maven ise deklaratifdir. Tek yapmanız gereken bir pom.xml dosyası oluşturmak ve kaynağınızı varsayılan dizine koymaktır.
Ant da bir yaşam döngüsü yoktur, hedefleri ve hedef bağımlılıklarını tanımlamanız gerekiyor. Her bir hedefe manuel olarak bir dizi görev eklemeniz gerekiyor. Maven ise derleme ve JAR oluşturma gibi şeyleri yapan bir dizi varsayılan hedefleri yapan yaşam döngüleri mevcuttur.
Kaynaklar
- http://ant.apache.org/manual/index.html
- http://ant.apache.org/ivy/
- http://maven.apache.org/index.html
- https://stackoverflow.com/questions/603189/differences-between-ant-and-maven
- https://tr.wikipedia.org/wiki/Apache_Ant
- https://turbine.apache.org/
- https://tr.wikipedia.org/wiki/Yidiş