Što je Maven? Izgradnja i upravljanje ovisnostima za Javu

Apache Maven je kamen temeljac Java razvoja i najkorišteniji alat za upravljanje gradnjom za Javu. Mavenov pojednostavljeni model konfiguracije zasnovan na XML-u omogućava programerima da brzo opisuju ili shvate obrise bilo kojeg projekta temeljenog na Javi, što pokretanje i dijeljenje novih projekata čini brzim. Maven također podržava testni razvoj, dugoročno održavanje projekata, a njegova deklarativna konfiguracija i širok raspon dodataka čine ga popularnom opcijom za CI / CD. Ovaj je članak kratki uvod u Maven, uključujući Maven POM i strukturu direktorija te naredbe za izgradnju vašeg prvog Maven projekta.

Imajte na umu da je najnovije izdanje Mavena od ovog pisanja Maven 3.6.3.

Maven vs Ant i Gradle

Maven nije jedini alat za izgradnju u ekosustavu Java, iako je najpopularniji. Antu, ranijoj generaciji XML-a zasnovanog alata, nedostaju Mavenovi standardizirani postupci i upravljanje ovisnostima utemeljeni na konvencijama, ali nudi fleksibilnost koju kod Mavena nećete pronaći. Gradle je noviji alat koji radi na vrhu ekosustava Maven (koristeći Mavenova spremišta), ali podržava upotrebu DSL-a temeljenog na Groovyju ili Kotlinu za konfiguraciju. Sva trojica su sami po sebi dobar alat za izgradnju i svaki se može integrirati u CI / CD postupak. Važno je odabrati pravi za svoje potrebe i znati kako ga na odgovarajući način koristiti.

Kako Maven djeluje

Poput mnogih izvrsnih alata, Maven uzima ono što je nekoć bilo prekomplicirano (pakao konfiguracije) i pojednostavljuje ga na probavljive dijelove. Maven se sastoji od tri komponente:

  • POM: Datoteka koja opisuje Maven projekt i njegove ovisnosti.
  • Imenik: Standardizirani format za opis Mavenova projekta u POM-u.
  • Spremišta: Gdje se pohranjuje i otkriva softver treće strane.

Maven POM : Svaki Java projekt koji koristi Maven ima datoteku POM (objektni model projekta) u svom korijenskom direktoriju. pom.xmlOpisuje zavisnost projekta i govori vam kako da ga izgrade. ( Ovisnosti su softver nezavisnih proizvođača koji zahtijeva projekt. Neki su uobičajeni primjeri JUnit i JDBC. Popis Maven Central Repository potražite u popisu svih dostupnih alata i popularnih ovisnosti.)

Maven direktorij : Maven direktorij implementira ono što je poznato kao konvencija nad konfiguracijom , elegantno rješenje za konfiguracijski pakao. Umjesto da zahtijeva od programera da definiraju izgled i ručno konfiguriraju komponente za svaki novi projekt (kao što je to bio slučaj s makefileAntom), Maven uspostavlja zajedničku strukturu projekta i nudi standardni format datoteke za opis rada. Vi samo uključite svoje zahtjeve, a Maven poziva ovisnosti i konfigurira projekt umjesto vas.

Centralizirana spremišta : Konačno, Maven koristi centralizirana spremišta kako bi otkrila i objavila pakete projekata kao ovisnosti. Kada u svom projektu navedete ovisnost, Maven će je otkriti u centraliziranom spremištu, preuzeti u lokalno spremište i instalirati u vaš projekt. Većinu vremena sve vam je to nevidljivo kao programeru.

Pristup Mavenovim ovisnostima

Prema zadanim postavkama Maven rješava ovisnosti iz središnjeg spremišta Maven. Uobičajena alternativa je JCenter koji ima širi skup dostupnih paketa. Organizacije također objavljuju i hostiraju unutarnja spremišta, koja mogu biti javna ili privatna. Da biste pristupili spremištu, navedite njegov URL u Maven POM-u ili možete uputiti Maven da traži u drugim spremištima.

Instaliranje Mavena

Maven je Java projekt, pa ćete prije instaliranja JDK morati instalirati u vaše razvojno okruženje. (Pogledajte "Što je JDK? Uvod u Java Development Kit" za više informacija o preuzimanju i instaliranju JDK-a.)

Nakon što postavite Java razvojno okruženje, možete instalirati Maven u samo nekoliko koraka:

  1. Preuzmite najnovije izdanje Maven (Maven 3.6.3 od ovog pisanja).
  2. Izdvojite apache.maven.zip datoteku na prikladno mjesto.
  3. Postavite tu datoteku na svoj put. Na primjer, na Unixu ili Linux sustavu: izvoz PATH=$PATH:/home/maven/.

Sada biste trebali imati pristup mvnnaredbi. Upišite mvn -vkako biste bili sigurni da ste uspješno instalirali Maven.

Maven POM

Korijen svakog Mavenova projekta je pom.xmldatoteka. Unatoč svojoj reputaciji zamornosti, XML zapravo dobro funkcionira za ovaj slučaj upotrebe. Mavenov POM lako se čita i otkriva mnogo toga što se događa u projektu. (Ako ste radili s JavaScriptom, pom.xmlsličan je svrsi package.jsondatoteci Node NPM-a .)

Popis 1 prikazuje vrlo jednostavan Maven pom.xml.

Popis 1. Jednostavni Maven POM

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

Razumijevanje Maven POM-a

Jednom kad se uhvatiš problema, POM nije tajanstven. Za početak možete preletjeti XML preambulu koja se samo poziva na službenu POM shemu. modelVersionMeđutim, primijetite XML počevši od . To Mavenu govori koju verziju POM-a treba koristiti, u ovom slučaju Maven POM 4.0.0.

Dalje, morate groupId, artifactIdi version. Ova tri atributa zajedno jedinstveno identificiraju svaki resurs kojim upravlja Maven u spremištu. Ovi atributi na vrhu datoteke opisuju vaš Maven projekt.

Sada, pogledajte dependenciesodjeljak POM-a, gdje opisujemo ovisnosti o projektu. U ovom smo slučaju do sada povukli samo jednu ovisnost, JUnit. Obavijest da JUnit je također opisana u smislu njegovih groupId, artifactIdi version.

Bez obzira opisujete li vlastiti projekt ili ovisnost o projektu, ove vrijednosti dosljedno govore Mavenu gdje pronaći projekt u spremištu Maven i koja je verzija dostupna za upotrebu.

Hostiranje vašeg projekta u spremištu Maven

Imajte na umu da POM definira sve što vaš projekt treba pokrenuti, ali također opisuje vaš projekt kao potencijalnu ovisnost. Ako gradite projekt koji će biti ovisnost - recimo, stvarate knjižnicu za korištenje drugim projektima - morat ćete je učiniti dostupnom na jedan od četiri načina:

  1. Neka bude dostupan lokalno.
  2. Objavi u privatnom upravljanom udaljenom spremištu.
  3. Objavi u privatnom spremištu zasnovanom na oblaku.
  4. Objavite u javnom spremištu poput Maven Central.

U prvom slučaju uopće ne upotrebljavate udaljeno spremište. Umjesto toga, drugi će programeri preuzeti i instalirati vaš projekt lokalno u svoj Maven repo, pomoću mvn installnaredbe.

U drugom slučaju, koristite hostirano spremište Maven, koristeći privatno kontrolirani poslužitelj za objavljivanje i preuzimanje ovisnosti. Za to vam je potreban upravitelj spremišta, poput Apache Archiva.

Novija je alternativa korištenje privatnog udaljenog repo-a, ali se za upravljanje oslanja na uslugu zasnovanu na oblaku, na primjer Cloudsmith. To daje prednost udaljenosti hostiranih ovisnosti bez rada uspravljanja repo poslužitelja. Ta se usluga naravno naplaćuje.

Konačno, mali postotak projekata završit će u središnjem spremištu Maven ili JCentru, koji su namijenjeni široko korištenim javnim paketima. Ako stvarate ovisnost otvorenog koda koju će koristiti drugi, trebat će vam jedno od ovih centraliziranih spremišta kako biste svoj rad učinili dostupnim svijetu.

  • Saznajte više o hostingu vašeg projekta u Maven repozitorijumu i nabavite popis dostupnih repozitorija.
  • Pogledajte službenu dokumentaciju Mavena o dodatku Maven Release, koji se koristi za pripremu i upravljanje softverom objavljenim u spremištu Maven.

Izradite paket Maven

Ako stvorite popis pom.xmliz popisa 1 i stavite ga u direktorij, moći ćete protiv njega pokrenuti Maven naredbe. Maven ima mnoštvo naredbi, a više ih je dostupno putem dodatka, ali za početak morate znati samo pregršt.

Za svoju prvu naredbu pokušajte izvršiti mvn package. Iako još nemate nijedan izvorni kod, izvršavanje ove naredbe govori Mavenu da preuzme ovisnost JUnit. Možete provjeriti Mavenov izlaz za bilježenje kako biste vidjeli je li ovisnost učitana ..

Opseg ovisnosti

Možda ste primijetili ovisnost JUnit u primjeru POM-a koji je označen kao scope test. Opseg je važan koncept u upravljanju ovisnostima, u osnovi vam omogućava da definirate i ograničite kako će se svaka ovisnost pozivati ​​i koristiti u vašem projektu. testOpseg osigurava ovisnost je dostupna kada se izvodi testove, ali ne i kad je aplikacija pakirani za implementaciju.

Sljedeći je uobičajeni opseg providedkoji govori okviru da ovisnost pruža runtime okruženje. To se često vidi kod Servlet JARS-a kada se postavlja u spremnik servleta, jer će spremnik pružiti te JARS-ove. Potpuni popis opsega ovisnosti o Mavenu potražite u dokumentaciji Apache Maven.

Mavenova struktura imenika

Kad je naredba gotova, primijetite da je Maven stvorio /targetdirektorij. To je standardno mjesto za izlaz vašeg projekta. Ovisnosti koje ste preuzeli nalazit će se u /targetdirektoriju, zajedno s vašim sastavljenim artefaktima aplikacije.

Dalje želite dodati Java datoteku koju ćete smjestiti u src/direktorij Maven . Stvorite /src/main/java/com/javaworld/Hello.javadatoteku sa sadržajem popisa 2.

Popis 2. Pozdrav.java

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

/srcPut je standardni mjesto za izvorne datoteke vašeg projekta. Većina projekata stavlja svoje glavne datoteke /src/main/, a Java datoteke idu u put predavanja ispod /java. Osim toga, ako želite uključiti sredstva koja nisu kod, poput konfiguracijskih datoteka ili slika, možete ih koristiti /src/main/resources. Sredstva na ovom putu bit će dodana glavnoj stazi do razreda. Probne datoteke idu u /src/test/java.

Da pregledamo, evo nekoliko ključnih dijelova strukture projekta Maven (kako je definirano Maven standardnom strukturom direktorija):

Ključni dijelovi Mavenove standardne strukture direktorija

pom.xml Datoteka deskriptora projekta
/ src / main / java Mjesto izvornih datoteka
/ src / main / resources Mjesto imovine koja nije izvor
/ src / test / java Mjesto ispitnih datoteka testa
/cilj Mjesto izlaza gradnje

Upravljanje vašim Maven projektom

mvn packageNaredba upućuje maVen na skupinu do projekta. Izdajte ovu naredbu kada budete spremni prikupiti sve datoteke projekta na jednom mjestu. Podsjetimo da smo u POM datoteci za ovaj projekt postavili vrstu pakiranja na jar, pa ova naredba govori Mavenu da paket aplikacija pakira u JAR.

Maven nudi razne dodatne mogućnosti za upravljanje načinom upravljanja JAR-om, bez obzira radi li se o debelom ili tankom JAR-u, i određivanje izvršne datoteke mainclass. Pogledajte dokumente Maven da biste saznali više o upravljanju datotekama u Mavenu.

Nakon što grupirate projekt, vjerojatno ćete htjeti izdati mvn install. Ova naredba gura projekt u lokalno spremište Maven. Jednom kad je u lokalnom spremištu, dostupan je drugim Maven projektima u vašem lokalnom sustavu. Ovo je korisno za razvojne scenarije u kojima vi i / ili vaš tim stvarate JAR-ove ovisnosti koji još nisu objavljeni u središnjem spremištu.

Dodatne Mavenove naredbe

Unesite mvn testkada budete spremni za pokretanje jediničnih testova koje ste definirali u /src/java/testdirektoriju.

Unesite mvn compilekada budete spremni za kompajliranje datoteka razreda projekta. Ako izvodite postavku vrućeg raspoređivanja, ova naredba pokreće učitač klase aktivnog postavljanja. (Alat za vruće raspoređivanje - poput mvn spring-boot:runnaredbe Spring Boot- a - promatrat će datoteke datoteka radi promjena, a kompajliranje će uzrokovati kompajliranje vaših izvornih datoteka, a pokrenut će program odražavati te promjene.)

Pokretanje novog projekta: Arhetipovi u Mavenu i proljeću

Maven arhetip je predložak za pokretanje novih projekata na temelju različitih predefiniranih postavki. Svaki arhetip nudi unaprijed zapakirane ovisnosti, poput Java EE ili projekta web aplikacije Java. Također možete stvoriti novi arhetip iz postojećeg projekta, a zatim ga koristiti za brzo stvaranje novih projekata na temelju tih unaprijed definiranih izgleda. Pogledajte dokumente Maven da biste saznali više o arhetipovima Apache Maven.

Proljetni okvir, koji dobro funkcionira s Mavenom, nudi dodatne, sofisticirane mogućnosti za zaustavljanje novih projekata. Kao primjer, Spring Initializr je alat koji vam omogućuje vrlo brzo definiranje elemenata koje želite u novoj aplikaciji. Initializr sam po sebi nije Mavenov arhetip, ali služi istoj svrhu generiranja rasporeda projekata na temelju prednjih specifikacija. Unutar Initializr možete tipkati mvn archetype:generatei pregledavati opcije kako biste pronašli arhetip koji je prikladan za ono što gradite.

Dodavanje ovisnosti