Ohjelmointi

Maven 2 POM demystifioitiin

Projektin rakentaminen on monimutkaista liiketoimintaa. Koska kymmeniä tehtäviä tarvitaan muunnettaessa tiedostosi hodge-podge työohjelmaksi, on olemassa kirjaimellisesti satoja työkaluja, jotka tekevät kaikkea lähdekoodin luomisesta, kääntämiseen, testaamiseen, jakeluun ja aamukahvin valmistamiseen (jos löydät yhden, rakas lukija, kerro minulle). Monet näistä ohjelmista ovat erinomaisia ​​siinä, mitä he tekevät. Valitettavasti niille meistä, jotka hallitsevat laajamittaisia ​​rakennusjärjestelmiä elantonsa varten, on harvoin paljon yhteistä; kukin ohjelma vaatii oman erillisen asennuksen ja esoteerisen kokoonpanon. On tullut väistämätön tosiasia elämässämme, että suurin osa rakennusjärjestelmistä on räätälöityjä liimaamalla nämä työkalut käsin useilla homebrew-skripteillä (joo, Ant-komentosarjat laskevat).

Maven on enemmän kuin toinen koontityökalu, koontiversio puitteet. Se erottaa koodisi puhtaasti määritystiedostoista, dokumentaatioista ja riippuvuuksista. Maven on yllättävän joustava antaessaan käyttäjien konfiguroida suurimman osan koodistaan ​​sekä hallita laajennusten käyttäytymistä, yksittäisiä tavoitteita ja jopa itse rakennuksen elinkaarta. Maven on todellinen rakenne, ja näiden seinien sisällä projektisi asuu; se haluaa olla mukava isäntä.

Mutta ongelma on edelleen: tuhansien räätälöityjen komentosarjojen työn hallinta yhdessä kehyksessä on vaikeaa ja oikein tehtäväksi vaatii paljon tietoa. Onneksi Maven 2 -tiimi on ollut varsin onnistunut. Oppimalla Maven 1: n virheistä, lukemattomista käyttäjäpyynnöistä, säätämisestä ja päivittämisestä, Maven 2 on tehokkaampi kuin koskaan. Valitettavasti suurella voimalla on suuri kokoonpano. Jotta Maven 2: n artefaktit olisivat helposti siirrettäviä yksiköitä, monimutkainen kokoonpano jakautuu yhteen tiedostoon. Syötä Maven POM.

Mikä on POM?

POM tarkoittaa projektiobjektimallia. Se on XML-esitys Maven-projektista, joka on tiedostossa nimeltä pom.xml. Mavenin ihmisten läsnä ollessa projektista puhuminen on puhetta filosofisessa mielessä pelkkää koodia sisältävien tiedostokokoelmien lisäksi. Projekti sisältää määritystiedostot, mukana olevat kehittäjät ja heidän roolinsa, vianseurantajärjestelmän, organisaation ja lisenssit, URL-osoitteen, jossa projekti asuu, projektin riippuvuudet ja kaikki muut pienet osat, jotka tulevat pelaamaan koodin antamiseksi elämää. Projekti on keskitetty kaikki siihen liittyvät asiat. Itse asiassa Maven-maailmassa projektin ei tarvitse sisältää mitään koodia, vain pom.xml. Tulemme kohtaamaan pari tällaista projektia myöhemmin artikkelissa.

Nopea rakennekatsaus

POM on suuri ja monimutkainen, joten sen hajottaminen palasiksi helpottaa ruoansulatusta. Tätä keskustelua varten nämä kappaleet ryhmitellään uudelleen neljään loogiseen yksikköön, kuten kuvassa 1 on esitetty: POM-suhteet, projektitiedot, koontiasetukset ja rakennusympäristö. Aloitamme keskustelemalla POM-suhteista.

Alla on luettelo elementeistä, jotka ovat suoraan POM: n projektielementin alla. Huomaa, että modelVersion sisältää 4.0.0. Se on tällä hetkellä ainoa tuettu POM-versio Maven 2: lle ja sitä vaaditaan aina. Maven 4.0.0 XML -mallin määritys sijaitsee osoitteessa //maven.apache.org/maven-v4_0_0.xsd. Sen ylätason elementit ovat seuraavat:

4.0.0

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

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

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

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

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

POM-suhteet

Ensimmäinen käsittelyjärjestyksemme on tutkia projektisuhteita, jotka on esitetty kuvassa 2 kuvion 1 kaavion vasemmassa yläkulmassa.

Hankkeiden on liityttävä toisiinsa jollakin tavalla. Ensimmäisten kokoonpanijoiden perustamisen jälkeen ohjelmistoprojekteilla on ollut riippuvuuksia; Maven on tuonut Java-projektiin käyttöön useita muita tähän mennessä käyttämättömiä suhteiden muotoja. Nämä suhteet ovat Maven-koordinaatteja, koordinaatteihin perustuvia riippuvuuksia, projektin periytymistä ja yhdistämistä.

Koordinaatit

Jokainen Maven-projekti sisältää oman yksilöllisen tunnisteensa, jota kutsutaan projektiksi koordinaatit, joka toimii kuin artefaktin osoite, antaen sille ainutlaatuisen paikan Maven-universumissa. Jos hankkeilla ei ole mitään tapaa olla yhteydessä toisiinsa, koordinaatteja ei tarvita. Toisin sanoen, jos maailmankaikkeudella olisi vain yksi talo, miksi se tarvitsisi osoitteen, kuten 315 Cherrywood Lane?

Alla oleva koodi on vähimmäismäärä, jonka Maven 2 sallii -, ja ovat kaikki pakollisia kenttiä. Ne toimivat vektorina Maven-avaruudessa elementtien ryhmittelijän, tunnisteen ja aikaleiman kanssa.

4.0.0org.codehaus.mojoa1

Maven-maailmassa nämä kolme pääelementtiä (The Mavenin kolminaisuus - katso sen kunniaa!) Muodostavat POM: n koordinaatit. Koordinaatit on esitetty kuvassa 3.

Ehkä tämä POM ei ole itsessään niin vaikuttava. Se muuttuu paremmaksi.

Riippuvuudet

Yksi Mavenin tehokkaimmista puolista on sen projektiriippuvuuksien käsittely, ja Maven 2: ssa se sisältää transitiiviset riippuvuudet. Kuva 4 havainnollistaa sitä, miten ne esitetään graafisesti.

Riippuvuuksien hallinnalla on pitkät perinteet olla monimutkainen sotku mihinkään muuhun kuin mitättömimpään projektiin. "Jarmageddon" alkaa nopeasti, kun riippuvuuspuusta tulee valtava, monimutkainen ja kiusallinen arkkitehdeille, jotka pilkkaavat uusista tutkinnon suorittaneista, jotka "olisivat voineet tehdä sen paremmin". Seuraavassa "Jar Hell", jossa yhden järjestelmän riippuvuuksien versiot eivät ole aivan samat versiot kuin kehityksessä käytetyt versiot; heillä on joko väärä versio tai ristiriitaiset versiot samannimisten JAR-tiedostojen välillä. Siksi asiat alkavat rikkoutua ja tunnistaa, miksi se osoittautuu vaikeaksi. Maven ratkaisee molemmat ongelmat omistamalla yhteisen paikallisen tietovaraston, josta voidaan linkittää oikeisiin projekteihin, versioihin ja kaikkiin.

Perintö

Yksi piirteistä, jotka Maven 2 tuo Maven 1 -päivistä, on projektiperintö, kuten kuvassa 5. Rakennusjärjestelmissä, kuten Ant, periytymistä voidaan varmasti simuloida, mutta Maven on ottanut ylimääräisen askeleen projektin perinnön selventämiseksi projektiobjektimalli.

Seuraava koodi määrittelee vanhemman POM: n Maven 2: ssa:

4.0.0org.codehaus.mojob2pom

Tämä vanhempi näyttää samanlaiselta kuin ensimmäinen POM, pienellä erolla. Huomaa, että olemme asettaneet pakkaus kirjoita pom, jota vaaditaan sekä emo- että aggregaattiprojekteille (käsittelemme lisää aiheesta pakkaus kohdassa "Rakenneasetukset"). Jos haluamme käyttää yllä olevaa projektia vanhempana, voimme muuttaa projektia org.codehaus.mojo: a POM olla:

4.0.0org.codehaus.mojob2a

On tärkeää huomata, että kaikki POM: t perivät vanhemmilta riippumatta siitä, onko ne määritelty nimenomaisesti vai ei. Tämä perus-POM tunnetaan nimellä "super POM", ja se sisältää oletusarvoisesti perityt arvot. Helppo tapa tarkastella super POMin oletuskokoonpanoja on luoda yksinkertainen pom.xml ilman muuta modelVersion, groupId, artefaktiIdja versioja komennon suorittaminen mvn help: tehokas-pom.

Sen lisäksi, että vain asetetaan arvot perimään, vanhemmilla on myös valta luoda oletusasetuksia lapsilleen asettamatta heille arvoja. Riippuvuuksien hallinta on erityisen tehokas väline riippuvuuksien määrittämiseen yhteisen sijainnin (POM: n vanhemman) kautta. riippuvuusHallinto elementin syntakse on samanlainen kuin riippuvuusosassa. Se kuitenkin antaa lapsille mahdollisuuden periä riippuvuusasetukset, mutta ei itse riippuvuutta. Riippuvuuden lisääminen riippuvuusHallinto elementti ei itse asiassa lisää riippuvuutta POM: iin eikä myöskään lisää riippuvuutta lapsista; se luo oletusasetukset kaikille riippuvuuksille, jotka lapsi voi päättää lisätä omaan riippuvuusosioonsa. Asetukset mennessä riippuvuusHallinto koskee myös nykyistä POM: n riippuvuuskonfiguraatiota (vaikka riippuvuuselementin sisällä ohitetut kokoonpanot ovat aina etusijalla).

Yhteenveto

Moduuleilla varustettu projekti tunnetaan multimoduuliprojektina. Moduulit ovat POM-luettelossa olevia projekteja, jotka toteutetaan sarjana. Monimoduuliprojektit tietävät moduulistaan, mutta päinvastoin ei välttämättä ole totta, kuten kuvassa 6 esitetään.

Olettaen, että ylätason POM sijaitsee sen päähakemistossa, missä POM projektille a ja että projekti a asuu myös samannimisessä hakemistossa, voimme muuttaa vanhempaa POM: ää b koota lapsi a lisäämällä se moduuliksi:

4.0.0org.codehaus.mojob2poma

Jos juoksimme mvn koota perushakemistossa näet rakennuksen aloituksen:

[INFO] Etsitään projekteja ... [INFO] Reaktorin rakennustilaus: [INFO] Nimetön - org.codehaus.mojo: b: pom: 2 [INFO] Nimetön - org.codehaus.mojo: a: purkki: 2 

Mavenin elinkaari suoritetaan nyt oikeassa järjestyksessä määriteltyyn elinkaarivaiheeseen asti; eli jokainen esine on rakennettu yksi kerrallaan, ja jos yksi esine edellyttää toisen rakentamista ensin, se on.

Huomautus perinnöstä vs. yhdistämisestä

Perintö ja yhdistäminen luovat mukavan dynamiikan rakennusten hallitsemiseksi yhden korkean tason POM: n avulla. Näet usein projekteja, jotka ovat sekä vanhempia että multimoduuleja, kuten yllä oleva esimerkki. Niiden täydentävyys tekee niistä luonnollisen ottelun. Jopa Maven 2 -projektin ydin kulkee yksinhuoltajan / multimoduulin POM: n läpi org.apache.maven: maven, joten Maven 2 -projektin rakentaminen voidaan suorittaa yhdellä komennolla: mvn koota. Vaikka niitä käytetään yhdessä, multimoduuli ja vanhempi eivät ole yksi ja sama, eikä niitä pidä sekoittaa. POM-projekti (joka toimii vanhempana) voidaan periä, mutta kyseinen pääprojekti ei välttämättä koota moduuleja. Päinvastoin, POM-projekti voi koota projektit, jotka eivät peri sitä.

Kun kaikki neljä yhtälön kappaletta on koottu yhteen, toivottavasti näet Maven 2 -suhdemekanismin voiman, kuten kuvassa 7 on esitetty.

Maven antaa meille mukavan kehyksen projektien liittämiseen toisiinsa, ja näiden suhteiden avulla voimme luoda laajennuksia, joita voidaan käyttää uudelleen millä tahansa projektilla Mavenin sopimusten mukaisesti. Mutta kyky hallita projektisuhteita on vain osa Mavenin yhtälöä. Loppuosa POM: sta ei ole kiinnostunut muista projekteista, vaan sen kokoonpanoasetuksista, tiedoista ja ympäristöstä. Nopeasti ymmärtämällä, miten projektit liittyvät toisiinsa poissa tieltä, aloitetaan katsomaan, kuinka POM sisältää tietoja varsinaisesta projektista.

$config[zx-auto] not found$config[zx-overlay] not found