The Maven 2 POM dibongkar

Membina projek adalah perniagaan yang kompleks. Kerana berpuluh-puluh tugas yang diperlukan dalam mengubah fail anda menjadi program yang berfungsi, terdapat ratusan alat yang melakukan segalanya dari menghasilkan kod sumber, menyusun, menguji, mengedar, hingga membuat kopi pagi anda (jika anda dapati, pembaca yang dikasihi, beritahu saya). Sebilangan besar program ini sangat baik dalam apa yang mereka lakukan. Malangnya, bagi kita yang menguruskan sistem binaan berskala besar, jarang sekali terdapat persamaan; setiap program memerlukan pemasangan dan konfigurasi esoterik yang berbeza. Sudah menjadi kenyataan yang tidak dapat dielakkan dalam kehidupan kita bahawa sebahagian besar sistem binaan dibuat khas dengan merekatkan alat-alat ini dengan beberapa skrip homebrew (ya, jumlah skrip Ant).

Lebih daripada alat binaan lain, Maven adalah kerangka binaan . Ini dengan jelas memisahkan kod anda dari fail konfigurasi, dokumentasi, dan pergantungan. Maven secara mengejutkan fleksibel dalam membiarkan pengguna mengkonfigurasi kebanyakan aspek kod mereka, serta dalam mengawal tingkah laku pemalam, tujuan individu, dan bahkan kitaran hidup sendiri. Maven adalah struktur sebenarnya, dan di dalam tembok ini, projek anda tetap ada; ia mahu menjadi tuan rumah yang akomodatif.

Tetapi masalahnya masih ada: menguruskan kerja ribuan skrip binaan khusus dalam satu kerangka kerja adalah sukar dan, untuk dilakukan dengan betul, memerlukan banyak maklumat. Nasib baik, pasukan Maven 2 cukup berjaya. Belajar dari kesalahan Maven 1, permintaan pengguna yang tidak terhitung jumlahnya, tweaking, dan kemas kini, Maven 2 lebih hebat daripada sebelumnya. Malangnya, dengan kekuatan yang hebat datang konfigurasi yang hebat. Agar artifak Maven 2 menjadi unit mudah alih, konfigurasi yang kompleks itu tergolong dalam satu fail. Masukkan POM Maven.

Apa itu POM?

POM bermaksud model objek projek. Ini adalah representasi XML dari projek Maven yang disimpan dalam fail bernama pom.xml. Di hadapan orang-orang Maven, membicarakan projek adalah bercakap dalam erti kata falsafah, di luar sekumpulan fail yang mengandungi kod. Projek mengandungi fail konfigurasi, serta pembangun yang terlibat dan peranan yang dimainkannya, sistem pelacakan kecacatan, organisasi dan lesen, URL tempat tinggal projek, ketergantungan projek, dan semua potongan kecil lain yang dimainkan untuk memberikan kod kehidupan. Projek adalah kedai sehenti untuk semua perkara yang berkaitan dengannya. Sebenarnya, di dunia Maven, projek tidak perlu mengandungi kod sama sekali, hanya pom.xml. Kami akan menemui beberapa jenis projek seperti itu kemudian dalam artikel.

Gambaran keseluruhan struktur yang cepat

POMnya besar dan kompleks, jadi memecahnya menjadi mudah untuk pencernaan. Untuk tujuan perbincangan ini, potongan ini digabungkan menjadi empat unit logik, seperti yang ditunjukkan pada Gambar 1: hubungan POM, maklumat projek, tetapan binaan, dan lingkungan binaan. Kita akan mulakan dengan membincangkan hubungan POM.

Di bawah ini adalah senarai unsur-unsur secara langsung di bawah elemen projek POM. Perhatikan yang modelVersionmengandungi 4.0.0. Itu adalah satu-satunya versi POM yang disokong untuk Maven 2 dan selalu diperlukan. Definisi skema Maven 4.0.0 XML terletak di //maven.apache.org/maven-v4_0_0.xsd. Unsur-unsur peringkat teratasnya adalah seperti berikut:

4.0.0

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

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

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

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

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

Hubungan POM

Urutan perniagaan pertama kami adalah untuk menyiasat hubungan projek, yang ditunjukkan dalam Gambar 2 sebagai sudut kiri atas carta dalam Gambar 1.

Projek mesti saling berkaitan dalam beberapa cara. Sejak penciptaan alat pemasangan pertama, projek perisian mempunyai kebergantungan; Maven telah memperkenalkan lebih banyak bentuk hubungan yang selama ini tidak digunakan dalam bentuk projek Java. Hubungan ini adalah koordinat Maven, pergantungan berdasarkan koordinat, pewarisan projek, dan agregasi.

Koordinat

Setiap projek Maven mengandungi pengecam uniknya sendiri, dijuluki koordinat projek , yang bertindak seperti alamat artifak, memberikannya tempat yang unik di alam semesta Maven. Sekiranya projek tidak mempunyai kaitan antara satu sama lain, koordinat tidak akan diperlukan. Maksudnya, jika alam semesta hanya memiliki satu rumah, mengapa ia memerlukan alamat seperti 315 Cherrywood Lane?

Kod di bawah adalah POM minimum yang Maven 2 akan membenarkan- , dan semua medan yang diperlukan. Mereka bertindak sebagai vektor di ruang Maven dengan unsur kerapu, pengecam dan cap waktu.

4.0.0org.codehaus.mojoa1

Di dunia Maven, ketiga elemen utama ini (triniti Maven — lihatlah kemuliaannya!) Membentuk koordinat POM. Koordinat diwakili oleh Rajah 3.

Mungkin POM ini tidak begitu mengagumkan dengan sendirinya. Keadaan akan bertambah baik.

Kebergantungan

Salah satu aspek Maven yang paling kuat adalah pengendalian kebergantungan projek, dan di Maven 2, yang merangkumi pergantungan transitif. Rajah 4 menggambarkan bagaimana kita akan mewakili mereka secara grafik.

Pengurusan ketergantungan mempunyai tradisi lama menjadi kekacauan yang rumit untuk apa sahaja kecuali projek yang paling remeh. "Jarmageddon" cepat terjadi ketika pohon kebergantungan menjadi besar, rumit, dan memalukan para arkitek yang dicemuh oleh lulusan baru yang "benar-benar dapat melakukannya dengan lebih baik." "Jar Hell" berikut, di mana versi kebergantungan pada satu sistem tidak sama dengan versi yang digunakan untuk pembangunan; mereka mempunyai versi yang salah atau versi yang bertentangan antara JAR bernama serupa. Oleh itu, perkara mula pecah dan menunjukkan mengapa terbukti sukar. Maven menyelesaikan kedua-dua masalah ini dengan mempunyai repositori tempatan yang sama untuk menghubungkan ke projek, versi dan semua yang betul.

Warisan

Salah satu ciri yang dibawa oleh Maven 2 dari Maven 1 hari adalah pewarisan projek, seperti yang ditunjukkan dalam Gambar 5. Dalam sistem binaan, seperti Semut, pewarisan pasti dapat disimulasikan, tetapi Maven telah mengambil langkah tambahan untuk menjadikan projek mewarisi eksplisit kepada model objek projek.

Kod berikut menentukan POM induk di Maven 2:

4.0.0org.codehaus.mojob2pom

Ibu bapa ini kelihatan serupa dengan POM pertama kami, dengan perbezaan kecil. Perhatikan bahawa kami telah menetapkan packagingjenis sebagai pom, yang diperlukan untuk projek induk dan agregator (kami akan membahas lebih lanjut packagingdi bahagian "Tetapan Binaan"). Sekiranya kita ingin menggunakan projek di atas sebagai ibu bapa, kita boleh mengubah org.codehaus.mojo:aPOM projek 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.

Apabila keempat-empat bahagian persamaan itu disatukan, semoga anda dapat melihat kekuatan mekanisme hubungan Maven 2, seperti yang ditunjukkan pada Gambar 7.

Maven memberi kita kerangka yang baik untuk menghubungkan projek antara satu sama lain, dan melalui hubungan ini, kita dapat membuat plug-in yang dapat digunakan kembali oleh mana-mana projek yang mengikuti konvensyen Maven. Tetapi kemampuan untuk menguruskan hubungan projek hanyalah sebahagian daripada persamaan Maven secara keseluruhan. Selebihnya POM tidak berkaitan dengan projek lain, tetapi dengan tetapan binaannya, maklumatnya, dan persekitarannya. Dengan pemahaman cepat mengenai bagaimana projek saling berkaitan antara satu sama lain, mari kita mulai melihat bagaimana POM mengandungi maklumat mengenai projek itu dengan betul.