Apache Maven Kirish
Tags: maven, java, pom, superpom
Published: 2024-06-24 14:15:25

**Umumiy tushuncha**
Command Language — bu Operatsion sistema(OS) tushunuvchi til. Unix OS uchun Unix shell(sh,bash,zsh),Windows OS uchun batch. Bu komandalar unikal nom va o’ziga hos parameterlardan tashkil topgan,misol uchun :

`cp ~/Download/apache-maven.zip ~/maven
cd ~/usr/var/lib
mkdir teset_directory
cat data.json`

va bu komandalar batch yoki shell bo’lishiga qarab farq qiladi. Bundan tashqari qo’shimcha o’rnatilgan dasturni ham o’zining komandalari bo’lishi mumkin. JDK uchun

`java -jar application.jar`

Postgres uchun

`-psql --host=localhost --port=5432 --dbname=postgres`

Maven uchun

`mvn clean install`

**Nima uchun Maven?**

Yuqoridagi komandalarni to’plami .sh yoki batch script orqali ishga tushirish mumkin,project ni yig’ish va ishga tushurish uchun aynan shunday scriptlarni yozish va ularni ishga tushirish kerak bo’lgan,bu o’z navbatida ba’zi bir noqulayliklarni keltirib chiqargan.
1. Platformaga bog’liqlilik Windows uchun .bat Linux OS lari uchun .sh.
2. Har bir pojectni o’ziga hos scirptlari bo’lgan va bu boshqa projectlar uchun har doim ham mos kelavermagan.Shuning uchun Apache Ant
dasturi ishlab chiqlgan.

**Apache Ant**

Projectni yeg’ish va uni avtomatlashtiruvchi XML tiliga asoslangan dastur u Java dasturlash tilida yozilganligi uchun platforma tanlamaydi va Make dasturini platformaga bog’liq bo’lmagan analogi hisoblanadi.Make — Linux OS lari uchun projectni avtomatlashtiruvchi yordamchi dastur. Biroq bu ikkala dastur ham universallikni ta’minlay olmagan ya’ni project yeg’ishni ma’lum bir qolib va uslubga keltiraolmagan,har bir projectni o’ziga hos strukturasi va life cycle bo’lgan,o’z navbatida bu porjectga yangi qo’shilgan dasturchilarni onboarding jarayonini sekinlashtirgan,shu sababdan Apache Maven dasturi ishlab chiqildi.

**Apache Maven**

XML tiliga asoslangan Java dasturlash tilida yozilgan dastur va u universallik va convetion project(barcha projectlar uchun ma’lum bir nizom yoki qolib) ni taqdim etgan.

Soddaroq til bilan aytganda Maven Plugin lar to’plami bu pluginlar o’z navbatida Goal lardan tashkil topgan.Yuqorida aytilganidek Maven Java dasturlash tilida yozilgan project plugin lar esa oddiy java project uning ichidagi Goal esa MOJO — Maven plain Old Java Object ya’ni oddiy Java class


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7clfmo8earffswpqyaiy.jpg)

Har bir plugin ichida default HelpMojo class mavjud.Barcha Mojo class lar [AbstractMojo](https://maven.apache.org/ref/3.2.3/maven-plugin-api/apidocs/org/apache/maven/plugin/AbstractMojo.html) class dan vorislik olgan.Misol uchun biron bir plugin da qanday goal lar mavjudligini bilish uchun

`mvn compiler:help`

yanada ko’proq malumot olish uchun -Ddetail=true JVM argument bilan ishga tushirish mumkin

**Archetype Plugin**

Bu plugin yordamchi plugin bo’lib,Maven project ni ma’lum bir qolib asosida yaratishga yordam beradi.Archetype plugin lar o’z navbatida bir necha turlarga bo’linadi.Archetype plugin 7 ta goal(4ta asosiy) goallardan tashkil topgan,bular ichidagi generate goal bizga Maven strukturali project yaratishimizga yordam beradi.Misol uchun

`mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DarchetypeVersion=3.2.5`

Spring va Hibernate frameforklari bilan Web dasturlarni yaratish uchun maxsus archetype.Bunday archetype lar juda ko’p batafsil bu yerda.
Mavenda plugin yoki projectlar ni nomlashda mahsus [convention ](https://uz.wikipedia.org/wiki/Konvensiya)mavjud.
Quyida oddiy Java project yaratish uchun archetype ko’rsatilgan.

`mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4`

Bu plugin ya’ni quickstart-archetype uni ishga tushirganimzdan so’ng bizdan groupId,artifactId va version kiritish talab qilinadi.
**_GroupId_** — maven project yoki plugin uchun unikal bo’lgan identifikator va u java paketlari nomlanish qoidasiga mos tushishi kerak.
**_ArtifactId_** — project JAR fayli uchun ihtiyoriy bo’gan nomi.
**_Version_** — project versiyasi,o’z navbatida version ham bir necha qismga bo’linadi,major.minor.increament-qualifier batafsil [bu yerda](https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855).

- _1. Major projectni asosiy versiyasi._
- _2. Minor project da qandaydur uncha katta bo’lmagan o’zgarish bo’lganda._
- 3. _Increament(majburiy emas) qandaydur hatoni to’g’irlash amalga oshirilganda(bug fix)._
- 4. _Quailfier(majburiy emas) project versiyasi haqida qo’shimcha ma’lumot misol uchun BETA,ALFA,RELEASE yoki SNAPSHOT._
- _Masalan: 1.2.10-SNAPSHOT_

Yuqorida aytilganidek Maven projectni ma’lum bir qolib strukturda yaratishga va o’z navbatida dasturchilarni bir project dan ikkinchi projectga o’tganda tez moslashishiga yordam berdi.Maven bo’lmagan project lardan farqli project ichidagi ochiq(source) kodlar main va test,main package-da asosiy klasslar test package-da asosiy klasslarni testlash uchun klasslar,shuningdek maven projectni asosiy konfiguratsion fayli pom.xml joylashgan.Pom fayl projectni qanday ishlashi va o’zini qanday tutushini belgilab beradi,undagi XSD schema esa ma’lum bir qolib asosida sozlashingizga yordam beradi.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pax1cbwwg0h2ehb0x1vu.png)

**POM va Super POM**

- **POM (Project Object Model)**

Maven project lari uchun asosiy konfiguratsion fayl,u asosiy 4 qismdan iborat.
**General Project Information** — bu qism project yeg’ilishi va ishga tushirilishiga hech qanday ta’sir o’tkazmaydigan qism bunda asosan meta ma’lumotlar joylashgan masalan project nomi,project sayti uchun havola(URL),contributors(qaysi dasturchilar ishtrok etkanligi),qo’shimcha litsenziyalar va h.k.z

**Build Environment** — bu qism projectni turli hil muhit(Dev,QA,PROD) da turli hil konfiguratsiya turli hil plugin lar bilan ishga tushirish uchun xizmat qiladi.

**POM Relationship** — Pom coordinates(groupId,artifactId,version) project nomlanishi tartibi va versiylarini boshqarish,multimodule katta bo’lgan projectlar uchun qismlarga bo’lish,inheritance (Super POM) bu haqida biroz keyinroq,dependencies eng asosiy qismlardan biri project uchun kerakli qo’shimcha kutubxonalar.

**Build Settings** — bu qismda projectni default holatda qanday ishlashini belgilashimiz,turli hil yangi pluginlar qo’shishimz source kodlarimizni joylashuvini belgilashimiz va ma’lum bir pluginga ma’lum bir gaol ni biriktirishimz mumkin



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j7sotjixpnk64d7mg3zv.png)

- **Super POM**

Yuqorida aytilganidek POM fayl maven projectlarining asosiy fayli hisoblanadi va bu fayllarda vorislik olish yo’lga qo’yilgan,Mavenda huddi Java dasturlash tilidagi Object klassi kabi POM fayllar uchun umumiy(base) fayl mavjud va bu fayl [Super POM](https://maven.apache.org/ref/3.9.8/maven-model-builder/super-pom.html) deb nomlanadi shuningdek bu faylni yuklab olingan maven project ichidan topish mumkin
`M2_HOME/lib//maven-model-builder-3.9.8.jar:org/apache/maven/model/pom-4.0.0.xml.`


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68lggooho5sdeh1ove3o.png)

**Repositories section** — bu qismda qo’shimcha kutubxonalar(dependencies) default qayerdan olib kelish kerakligi ko’rsatilgan.
**PluginRepositories section** — bu qismda project uchun kerak bo’ladigan pluginlarni qayerdan olib kelish ko’rsatilgan.
**Build section** — yuqorida aytilganidek bu qism kompilyatsadan o’tgan ochiq kodlarimizni qaysi joyda saqlashimiz,resource fayllarni qayrdan qidirish test klasslarni default saqlanish joyi,yordamchi pluginlarni default versiyasi belgilab qo’yilgan bo’ladi.
Albatta vorislik orqali yuqoridagi barcha sozlamalarni qayta aniqlab(override) o’zgartirishimiz mumkin(tavsiya etilmaydi).

Bundan tashqari yordamchi pluginlardan tashqari default bo’lgan plugin lar mavjud,bu pluginlar oldindan maven projectlariga o’rnatilgan bo’ladi,eski versiyalardan bu pluginlar Super POM tarkibiga kirgan hozirga kelib uni alohida olib chiqishgan.Demak bizda POM faylmizni oxirgi natijaviy(final) ko’rinishi,Super POM,oldindan o’rnatilgan default pluginlar va projectimzdagi POM fayl.Projectmizni natifaviy(final) ko’rinishini mahsus Help plugini orqali ko’rishimiz mumkin.

`mvn help:effective-pom`

**Abbos Abduhakimov**

- **_Savol va takliflar uchun menga yozishdan uyalmang._**

- _email: abbos.abdukhakimov@gmail.com_

- _linkedin: www.linkedin.com/in/abbos-abduhakimov_