Maven nedir? Java için derleme ve bağımlılık yönetimi

Apache Maven, Java geliştirmenin temel taşlarından biridir ve Java için en çok kullanılan derleme yönetim aracıdır. Maven'in basitleştirilmiş, XML tabanlı yapılandırma modeli, geliştiricilerin herhangi bir Java tabanlı projenin ana hatlarını hızlı bir şekilde tanımlamasına veya kavramasına olanak tanıyarak yeni projeleri başlatmayı ve paylaşmayı çok kolaylaştırır. Maven ayrıca test odaklı geliştirmeyi, uzun vadeli proje bakımını destekler ve bildirime dayalı yapılandırması ve geniş eklenti yelpazesi, onu CI / CD için popüler bir seçenek haline getirir. Bu makale, Maven POM ve dizin yapısı ve ilk Maven projenizi oluşturmak için komutlar dahil olmak üzere Maven'e hızlı bir giriş niteliğindedir.

Bu yazı itibariyle en son Maven sürümünün Maven 3.6.3 olduğuna dikkat edin.

Maven, Ant ve Gradle'a Karşı

Maven, en popüler olanı olmasına rağmen, Java ekosistemindeki tek oluşturma aracı değildir. Önceki nesil bir XML tabanlı yapılandırma aracı olan Ant, Maven'in standartlaştırılmış, kurallara dayalı uygulamaları ve bağımlılık yönetiminden yoksundur, ancak Maven ile bulamayacağınız bir esneklik sunar. Gradle, Maven ekosisteminin üzerinde çalışan (Maven'in depolarını kullanan), ancak yapılandırma için Groovy veya Kotlin tabanlı DSL kullanımını destekleyen daha yeni bir araçtır. Üçü de kendi başlarına iyi derleme araçlarıdır ve her biri bir CI / CD sürecine entegre edilebilir. Önemli olan ihtiyaçlarınız için doğru olanı seçmek ve onu uygun şekilde nasıl kullanacağınızı bilmektir.

Maven nasıl çalışır?

Birçok harika araç gibi, Maven bir zamanlar aşırı karmaşık olanı (konfigürasyon cehennemi) alır ve sindirilebilir parçalara basitleştirir. Maven üç bileşenden oluşur:

  • POM: Bir Maven projesini ve bağımlılıklarını tanımlayan dosya.
  • Dizin: POM'da bir Maven projesini açıklamak için standartlaştırılmış format.
  • Depolar: Üçüncü taraf yazılımların depolandığı ve keşfedildiği yerler.

Maven POM : Maven kullanan her Java projesinin kök dizininde bir POM (proje nesne modeli) dosyası vardır. pom.xmlProjenin bağımlılıkları açıklar ve nasıl inşa etmek anlatır. ( Bağımlılıklar , proje için gerekli olan üçüncü taraf yazılımlardır. Bazı yaygın örnekler JUnit ve JDBC'dir. Mevcut tüm araçların ve popüler bağımlılıkların listesi için Maven Merkezi Deposuna bakın.)

Maven dizini : Maven dizini , konfigürasyon cehennemine zarif bir çözüm olan konfigürasyon yerine kongre olarak bilinen şeyi uygular . makefileMaven, geliştiricilerin her yeni proje için düzeni tanımlamasını ve bileşenleri elle yapılandırmasını zorunlu kılmak yerine ( ve Ant'ta olduğu gibi), ortak bir proje yapısı oluşturur ve nasıl çalıştığını açıklamak için standart bir dosya formatı sunar. Siz sadece gereksinimlerinizi yerine getirirsiniz ve Maven bağımlılıkları çağırır ve projeyi sizin için yapılandırır.

Merkezi depolar : Son olarak, Maven proje paketlerini bağımlılıklar olarak hem keşfetmek hem de yayınlamak için merkezi depoları kullanır. Projenizde bir bağımlılığa referans verdiğinizde, Maven onu merkezi depoda keşfedecek, yerel bir depoya indirecek ve projenize yükleyecektir. Çoğu zaman, tüm bunlar geliştirici olarak size görünmez.

Maven bağımlılıklarına erişim

Varsayılan olarak Maven, bağımlılıkları Maven Merkezi Deposundan çözer. Yaygın bir alternatif, daha geniş bir paket setine sahip olan JCenter'dır. Kuruluşlar ayrıca genel veya özel olabilen dahili havuzları yayınlar ve barındırır. Bir arşive erişmek için, onun URL'sini Maven POM'da belirtirsiniz veya Maven'e diğer depolara bakması talimatını verebilirsiniz.

Maven'i yükleme

Maven bir Java projesidir, bu yüzden onu yüklemeden önce JDK'nın geliştirme ortamınızda kurulu olması gerekir. (JDK'nın indirilmesi ve yüklenmesi hakkında daha fazla bilgi için "JDK nedir? Java Geliştirme Kitine Giriş" bölümüne bakın.)

Java geliştirme ortamı kurulumunuzu yaptıktan sonra, Maven'i yalnızca birkaç adımda yükleyebilirsiniz:

  1. En son Maven sürümünü indirin (bu yazı itibariyle Maven 3.6.3).
  2. Özü apache.mavenuygun bir yere .zip dosyasını.
  3. Bu dosyayı yolunuza yerleştirin. Örneğin, bir Unix veya Linux sisteminde: dışa aktarın PATH=$PATH:/home/maven/.

Artık mvnkomuta erişiminiz olmalıdır . Tip mvn -vemin başarıyla yükledim Maven yapmak.

Maven POM

Her Maven projesinin kökü pom.xmldosyadır. Sıkıcı olma konusundaki ününe rağmen, XML aslında bu kullanım durumunda oldukça iyi çalışıyor. Maven'in POM'unun okunması kolaydır ve bir projede neler olup bittiğini ortaya çıkarır. (JavaScript ile çalıştıysanız pom.xml, amaç olarak Node NPM'nin package.jsondosyasına benzer .)

Liste 1, çok basit bir Maven'i gösterir pom.xml.

Listeleme 1. Simple Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Maven POM'u Anlamak

Bir kez asıldığınızda, POM gizemli değildir. Başlamak için, sadece resmi POM şemasına atıfta bulunan XML girişini gözden geçirebilirsiniz. modelVersionBununla birlikte , XML ile başlayan dikkat edin . Bu, Maven'e POM'un hangi sürümünü kullanacağını söyler, bu durumda Maven POM 4.0.0.

Daha sonra, var groupId, artifactIdve version. Bu üç özellik birlikte, havuzdaki Maven tarafından yönetilen her kaynağı benzersiz şekilde tanımlar. Dosyanın üst kısmındaki bu öznitelikler Maven projenizi açıklar.

Şimdi, dependenciesprojenin bağımlılıklarını tanımladığımız POM bölümüne bir göz atın . Bu durumda şimdiye kadar sadece bir bağımlılık yaptık, JUnit. JUnit da onun açısından açıklandığını Bildirimi groupId, artifactIdve version.

İster kendi projenizi ister bir proje bağımlılığını tanımlıyor olun, bu değerler Maven'e sürekli olarak Maven deposundaki bir projeyi nerede bulacağını ve hangi sürümün kullanılabileceğini söyler.

Projenizi bir Maven deposunda barındırma

POM'un projenizin çalışması için ihtiyaç duyduğu her şeyi tanımladığını, ancak aynı zamanda projenizi potansiyel bir bağımlılık olarak tanımladığını unutmayın. Bağımlılık olacak bir proje oluşturuyorsanız - örneğin, diğer projelerin kullanması için bir kütüphane oluşturuyorsanız - bunu dört yoldan biriyle kullanıma sunmanız gerekir:

  1. Yerel olarak kullanılabilir hale getirin.
  2. Özel olarak yönetilen uzak bir depoda yayınlayın.
  3. Bulut tabanlı özel bir depoda yayınlayın.
  4. Maven Central gibi halka açık bir depoda yayınlayın.

İlk durumda, hiçbir şekilde uzak bir depo kullanmazsınız. Bunun yerine, diğer geliştiriciler mvn installkomutu kullanarak projenizi yerel olarak Maven depolarına indirecek ve yükleyecektir .

İkinci durumda, bağımlılıkları yayınlamak ve indirmek için özel olarak kontrol edilen bir sunucu kullanarak barındırılan bir Maven deposunu kullanırsınız. Bunun için Apache Archiva gibi bir depo yöneticisine ihtiyacınız var.

Daha yeni bir alternatif, özel bir uzak depo kullanmak, ancak onu yönetmek için bulut tabanlı bir hizmete, örneğin Cloudsmith'e güvenmektir. Bu, bir repo sunucusunu ayakta tutma işi olmadan uzaktan barındırılan bağımlılıkların faydasını sağlar. Bu hizmet elbette bir ücret karşılığında.

Son olarak, projelerin küçük bir yüzdesi, yaygın olarak kullanılan genel paketler için tasarlanan Merkezi Maven Deposu veya JCenter'da sona erecektir. Başkaları tarafından kullanılmak üzere açık kaynaklı bir bağımlılık oluşturuyorsanız, çalışmanızı dünyanın kullanımına sunmak için bu merkezi depolardan birine ihtiyacınız olacak.

  • Projenizi bir Maven deposunda barındırma hakkında daha fazla bilgi edinin ve mevcut depoların bir listesini alın.
  • Bir Maven havuzunda yayınlanan yazılımı hazırlamak ve yönetmek için kullanılan Maven Sürüm Eklentisi hakkındaki resmi Maven belgelerine bakın.

Maven paketini oluşturun

Eğer oluşturursanız pom.xmlListesinde 1 den ve bir dizine koyun, sen buna karşı Maven komutları çalıştırmak mümkün olacak. Maven'in çok sayıda komutu vardır ve daha fazlası eklenti aracılığıyla kullanılabilir, ancak başlamak için yalnızca bir avuç dolusu bilmeniz gerekir.

İlk komutunuz için, çalıştırmayı deneyin mvn package. Henüz herhangi bir kaynak kodunuz olmasa da, bu komutu çalıştırmak Maven'e JUnit bağımlılığını indirmesini söyler. Bağımlılığın yüklendiğini görmek için Maven'in günlük çıktısını kontrol edebilirsiniz.

Bağımlılık kapsamı

Örnekte JUnit bağımlılığının POM olarak işaretlendiğini fark etmiş olabilirsiniz scope test. Kapsam , bağımlılık yönetiminde önemli bir kavramdır ve esasen projenizde her bir bağımlılığın nasıl çağrılacağını ve kullanılacağını tanımlamanıza ve sınırlamanıza izin verir. testKapsamı ancak uygulama dağıtım için paketlendiğinde, testler sırasında bağımlılık kullanılabilir olmasını sağlar.

Diğer bir yaygın kapsam, providedçerçeveye bağımlılığın çalışma zamanı ortamı tarafından sağlandığını söyleyen şeydir. Konteyner bu JARS'ı sağlayacağından, bu genellikle Servlet JARS ile bir servlet konteynerine konuşlandırılırken görülür. Maven bağımlılık kapsamlarının tam listesi için Apache Maven belgelerine bakın.

Maven'in dizin yapısı

Komut tamamlandığında, Maven'in bir /targetdizin oluşturduğuna dikkat edin . Bu, projenizin çıktısı için standart konumdur. İndirdiğiniz bağımlılıklar /target, derlenmiş uygulama eserlerinizle birlikte dizinde bulunur .

Daha sonra, Maven src/dizinine yerleştireceğiniz bir Java dosyası eklemek istiyorsunuz . /src/main/java/com/javaworld/Hello.javaListe 2'nin içeriğiyle bir dosya oluşturun .

Liste 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/srcYol projenizin kaynak dosyaları için standart bir nokta. Çoğu proje /src/main/, Java dosyaları altındaki sınıf yoluna giderken ana dosyalarını yerleştirir /java. Ek olarak, yapılandırma dosyaları veya görüntüler gibi kod olmayan varlıkları dahil etmek istiyorsanız kullanabilirsiniz /src/main/resources. Bu yoldaki varlıklar ana sınıf yoluna eklenecektir. Test dosyaları içine girer /src/test/java.

İncelemek için, burada bir Maven proje yapısının (Maven Standart Dizin Yapısı tarafından tanımlandığı şekilde) bazı önemli bölümleri verilmiştir:

Maven Standart Dizin Yapısının temel parçaları

pom.xml Proje tanımlayıcı dosyası
/ src / main / java Kaynak dosyaların konumu
/ src / main / kaynaklar Kaynak olmayan varlıkların konumu
/ src / test / java Test kaynak dosyalarının konumu
/hedef Derleme çıktısının konumu

Maven projenizi yönetme

mvn packageMaven komutuyla projesini paketlemek için. Tüm proje dosyalarınızı tek bir yerde toplamaya hazır olduğunuzda bu komutu verin. Bu projenin POM dosyasında paketleme türünü olarak ayarladığımızı hatırlayın jar, bu nedenle bu komut Maven'e uygulama dosyalarını bir JAR'a paketlemesini söyler.

Maven, ister kalın ister zayıf bir JAR olsun, JAR'ın nasıl yönetildiğini kontrol etmek ve bir yürütülebilir dosya belirlemek için çeşitli ek seçenekler sunar mainclass. Maven'de dosya yönetimi hakkında daha fazla bilgi edinmek için Maven belgelerine bakın.

Bir projeyi bir araya getirdikten sonra, büyük olasılıkla bir mvn install. Bu komut, projeyi yerel Maven deposuna iter. Yerel depoya girdiğinde, yerel sisteminizdeki diğer Maven projeleri tarafından kullanılabilir. Bu, sizin ve / veya ekibinizin henüz merkezi bir depoda yayınlanmayan bağımlılık JAR'ları oluşturduğu geliştirme senaryoları için kullanışlıdır.

Ek Maven komutları

mvn testDizinde tanımladığınız birim testlerini çalıştırmaya hazır olduğunuzda girin /src/java/test.

mvn compileProjenin sınıf dosyalarını derlemeye hazır olduğunuzda girin . Bir çalışırken dağıtım kurulumu çalıştırıyorsanız, bu komut çalışırken dağıtım sınıfı yükleyiciyi tetikler. (Hot-deploy aracı - Spring mvn spring-boot:runBoot'un komutu gibi - değişiklikler için sınıf dosyalarını izleyecek ve derleme, kaynak dosyalarınızın derlenmesine neden olacak ve çalışan uygulama bu değişiklikleri yansıtacaktır.)

Yeni bir projeye başlamak: Maven ve Baharda Arketipler

Bir Maven Arketip önceden tanımlanmış ayarları çeşitli dayalı yeni projeleri başlatmak için bir şablondur. Her arketip, bir Java EE veya Java web uygulaması projesi gibi önceden paketlenmiş bağımlılıklar sunar. Ayrıca mevcut bir projeden yeni bir arketip oluşturabilir, ardından bu önceden tanımlanmış düzenlere dayalı olarak hızla yeni projeler oluşturmak için kullanabilirsiniz. Apache Maven arketipleri hakkında daha fazla bilgi edinmek için Maven belgelerine bakın.

Maven ile iyi çalışan Yay çerçevesi, yeni projelerin taslak haline getirilmesi için ek, gelişmiş yetenekler sunar. Örnek olarak, Spring Initializr, yeni bir uygulamada istediğiniz öğeleri çok hızlı bir şekilde tanımlamanıza izin veren bir araçtır. Initializr, kendi başına bir Maven arketipi değildir, ancak önden gelen özelliklere dayalı bir proje düzeni oluşturmakla aynı amaca hizmet eder. Initializr mvn archetype:generateiçinden, inşa ettiğiniz şeye uygun bir arketip bulmak için seçenekleri yazabilir ve tarayabilirsiniz.

Bağımlılıklar ekleme