The Maven 2 POM mengungkap

Membangun proyek adalah bisnis yang kompleks. Karena lusinan tugas yang diperlukan dalam mengonversi berkas hodge-podge Anda menjadi program yang berfungsi, terdapat ratusan alat yang melakukan segalanya mulai dari menghasilkan kode sumber, untuk menyusun, menguji, mendistribusikan, hingga menyeduh kopi pagi Anda (jika Anda menemukannya, pembaca yang budiman, beri tahu saya). Banyak dari program ini sangat baik dalam apa yang mereka lakukan. Sayangnya, bagi kita yang mengelola sistem build skala besar untuk mencari nafkah, jarang ada banyak kesamaan; setiap program membutuhkan instalasi yang berbeda dan konfigurasi esoterik. Sudah menjadi fakta yang tak terhindarkan dalam hidup kita bahwa sebagian besar sistem build dibuat khusus dengan menempelkan alat ini dengan tangan menggunakan beberapa skrip homebrew (ya, skrip Ant dihitung).

Lebih dari fitur build lainnya, Maven adalah framework build . Ini dengan bersih memisahkan kode Anda dari file konfigurasi, dokumentasi, dan dependensi. Maven sangat fleksibel dalam memungkinkan pengguna mengonfigurasi sebagian besar aspek kode mereka, serta dalam mengontrol perilaku plugin, tujuan individu, dan bahkan siklus proses build itu sendiri. Maven adalah struktur sebenarnya, dan di dalam tembok ini, proyek Anda berdiam; itu ingin menjadi tuan rumah yang akomodatif.

Namun masalahnya masih tetap: mengelola pekerjaan ribuan skrip build khusus dalam satu kerangka kerja itu sulit dan, untuk dilakukan dengan benar, membutuhkan banyak informasi. Untungnya, tim Maven 2 sudah cukup sukses. Belajar dari kesalahan Maven 1, permintaan pengguna yang tak terhitung jumlahnya, tweaker, dan pembaruan, Maven 2 lebih kuat dari sebelumnya. Sayangnya, dengan kekuatan yang besar muncul konfigurasi yang hebat. Agar artefak Maven 2 menjadi unit yang mudah dibawa-bawa, konfigurasi kompleks itu jatuh ke dalam satu file. Masuk ke POM Maven.

Apa itu POM?

POM adalah singkatan dari model objek proyek. Ini adalah representasi XML dari proyek Maven yang disimpan dalam file bernama pom.xml. Di hadapan orang-orang Maven, berbicara tentang sebuah proyek berbicara dalam pengertian filosofis, di luar kumpulan file yang berisi kode. Sebuah proyek berisi file konfigurasi, serta pengembang yang terlibat dan peran yang mereka mainkan, sistem pelacakan cacat, organisasi dan lisensi, URL tempat tinggal proyek, ketergantungan proyek, dan semua bagian kecil lainnya yang ikut bermain untuk memberikan kode kehidupan. Proyek adalah toko serba ada untuk semua hal yang terkait dengannya. Faktanya, di dunia Maven, sebuah proyek tidak perlu mengandung kode sama sekali, hanya pom.xml. Kami akan menemukan beberapa jenis proyek seperti itu nanti di artikel.

Tinjauan struktural cepat

POM itu besar dan kompleks, jadi memecahnya menjadi beberapa bagian memudahkan pencernaan. Untuk keperluan diskusi ini, potongan-potongan ini dikelompokkan kembali menjadi empat unit logis, seperti yang ditunjukkan pada Gambar 1: hubungan POM, informasi proyek, pengaturan build, dan lingkungan build. Kami akan mulai dengan membahas hubungan POM.

Di bawah ini adalah daftar elemen langsung di bawah elemen proyek Badan POM. Perhatikan yang modelVersionberisi 4.0.0. Itu adalah satu-satunya versi POM yang didukung untuk Maven 2 dan selalu diperlukan. Definisi skema XML Maven 4.0.0 terletak di //maven.apache.org/maven-v4_0_0.xsd. Elemen tingkat atas adalah sebagai berikut:

4.0.0

... ... ... ... ... ... ...

... ... ... ... ... ... ... ...

... ... ... ...

... ... ... ...

... ... ... ... ...

Hubungan POM

Urutan pertama bisnis kita adalah menyelidiki hubungan proyek, yang direpresentasikan pada Gambar 2 sebagai sudut kiri atas bagan pada Gambar 1.

Proyek harus berhubungan satu sama lain dalam beberapa cara. Sejak penciptaan assembler pertama, proyek perangkat lunak memiliki ketergantungan; Maven telah memperkenalkan lebih banyak bentuk hubungan yang sampai sekarang tidak digunakan dalam bentuk seperti itu untuk proyek Java. Hubungan ini adalah koordinat Maven, dependensi berbasis koordinat, warisan proyek, dan agregasi.

Koordinat

Setiap proyek Maven berisi pengenal uniknya sendiri, yang diberi nama koordinat proyek , yang berfungsi seperti alamat artefak, memberinya tempat unik di alam semesta Maven. Jika proyek tidak memiliki cara untuk berhubungan satu sama lain, koordinat tidak diperlukan. Artinya, jika alam semesta hanya memiliki satu rumah, mengapa perlu alamat seperti 315 Cherrywood Lane?

Kode di bawah adalah POM minimum yang Maven 2 akan allow- , dan semua bidang yang diperlukan. Mereka bertindak sebagai vektor di ruang Maven dengan pengelompokan elemen, pengenal, dan stempel waktu.

4.0.0org.codehaus.mojoa1

Di dunia Maven, tiga elemen utama ini (The Maven trinity — lihatlah kemuliaannya!) Membentuk koordinat POM. Koordinat diwakili oleh Gambar 3.

Mungkin POM ini sendiri tidak begitu mengesankan. Semakin membaik.

Dependensi

Salah satu aspek Maven yang paling kuat adalah penanganan dependensi proyek, dan di Maven 2, hal itu mencakup dependensi transitif. Gambar 4 mengilustrasikan bagaimana kita akan merepresentasikannya secara grafis.

Manajemen ketergantungan memiliki tradisi panjang untuk menjadi kekacauan yang rumit untuk apa pun kecuali proyek yang paling sepele. "Jarmageddon" dengan cepat terjadi ketika pohon ketergantungan menjadi besar, rumit, dan memalukan bagi arsitek yang dicemooh oleh lulusan baru yang "benar-benar bisa melakukannya dengan lebih baik." "Jar Hell" mengikuti, di mana versi dependensi pada satu sistem tidak persis sama dengan versi yang digunakan untuk pengembangan; mereka memiliki versi yang salah atau versi yang bertentangan antara JAR yang memiliki nama serupa. Oleh karena itu, banyak hal mulai rusak dan menunjukkan dengan tepat mengapa terbukti sulit. Maven memecahkan kedua masalah ini dengan memiliki repositori lokal umum untuk ditautkan ke proyek, versi, dan semuanya yang benar.

Warisan

Salah satu fitur yang dibawa Maven 2 dari Maven 1 hari adalah project inheritance, seperti yang ditunjukkan pada Gambar 5. Dalam sistem build, seperti Ant, inheritance tentunya dapat disimulasikan, tetapi Maven telah mengambil langkah ekstra dalam membuat project inheritance eksplisit untuk model objek proyek.

Kode berikut mendefinisikan POM induk di Maven 2:

4.0.0org.codehaus.mojob2pom

Induk ini terlihat mirip dengan POM pertama kami, dengan sedikit perbedaan. Perhatikan bahwa kita telah menetapkan packagingtipe sebagai pom, yang diperlukan untuk proyek induk dan agregator (kita akan membahas lebih lanjut packagingdi bagian "Pengaturan Bangun"). Jika kita ingin menggunakan proyek di atas sebagai induk, kita dapat mengubah proyek org.codehaus.mojo:aPOM menjadi:

4.0.0org.codehaus.mojob2a

It is important to note that all POMs inherit from a parent whether explicitly defined or not. This base POM is known as the "super POM," and contains values inherited by default. An easy way to look at the default configurations of the super POM is by creating a simple pom.xml with nothing but modelVersion, groupId, artifactId, and version, and running the command mvn help:effective-pom.

Beyond simply setting values to inherit, parents also have the power to create default configurations for their children without actually imposing values upon them. Dependency management is an especially powerful instrument for configuring a set of dependencies through a common location (a POM's parent). The dependencyManagement element syntax is similar to that of the dependency section. What it does, however, is allow children to inherit dependency settings, but not the dependency itself. Adding a dependency with the dependencyManagement element does not actually add the dependency to the POM, nor does it add a dependency to the children; it creates a default configuration for any dependency that a child may choose to add within its own dependency section. Settings by dependencyManagement also apply to the current POM's dependency configuration (although configurations overridden inside the dependency element always take precedence).

Aggregation

A project with modules is known as a multimodule project. Modules are projects that a POM lists, executed as a set. Multimodule projects know of their modules, but the reverse is not necessarily true, as represented in Figure 6.

Assuming that the parent POM resides in the parent directory of where POM for project a lives, and that the project a also resides in a directory of the same name, we may alter the parent POM b to aggregate the child a by adding it as a module:

4.0.0org.codehaus.mojob2poma

Now if we ran mvn compile in the base directory, you would see the build start with:

[INFO] Scanning for projects... [INFO] Reactor build order: [INFO] Unnamed – org.codehaus.mojo:b:pom:2 [INFO] Unnamed – org.codehaus.mojo:a:jar:2 

The Maven lifecycle will now execute up to the lifecycle phase specified in correct order; that is, each artifact is built one at a time, and if one artifact requires another to be built first, it will be.

A note on inheritance vs. aggregation

Inheritance and aggregation create a nice dynamic for controlling builds through a single, high-level POM. You will often see projects that are both parents and multimodules, such as the example above. Their complementariness makes them a natural match. Even the Maven 2 project core runs through a single parent/multimodule POM org.apache.maven:maven, so building a Maven 2 project can be executed by a single command: mvn compile. Although used in conjunction, however, a multimodule and a parent are not one in the same, and should not be confused. A POM project (acting as a parent) may be inherited from, but that parent project does not necessarily aggregate any modules. Conversely, a POM project may aggregate projects that do not inherit from it.

Ketika keempat persamaan tersebut disatukan, semoga Anda akan melihat kekuatan mekanisme hubungan Maven 2, seperti yang ditunjukkan pada Gambar 7.

Maven memberi kita kerangka kerja yang bagus untuk menghubungkan proyek satu sama lain, dan melalui hubungan ini, kita dapat membuat plug-in yang dapat digunakan kembali oleh proyek apa pun yang mengikuti konvensi Maven. Tetapi kemampuan untuk mengelola hubungan proyek hanyalah sebagian dari persamaan Maven secara keseluruhan. POM lainnya tidak peduli dengan proyek lain, tetapi dengan pengaturan pembangunannya, informasinya, dan dengan lingkungannya. Dengan pemahaman cepat tentang bagaimana proyek saling berhubungan satu sama lain, mari kita mulai melihat bagaimana POM berisi informasi tentang proyek yang tepat.