Maven repository kezelés Sonatype Nexus-al
Nagyobb projekteknél elégé gyakori, hogy a használt komponenseket nem lehet fellelni egy adott repóba, hanem több helyről kell összegyűjteni. Ráadásul ezt meg kell ismételni minden egyes projektnél. Mi lenne, ha lehetőségünk lenne arra, e sok repó helyett csak egy repót használjunk, amely képes lenne a többi repóval kommunikálni, és adott esetben azoktól lekérni, majd a programozó felé elérhetővé tenni a komponenst?
A másik problémás helyzet, amely a Maven használatánál előjöhet, hogy a keresett komponenst nem találjuk egyik repóban sem, hanem csak az internetről letölthető (vagy pl. cégen belül előállított komponensről legyen szó) a komponens. Ilyen probléma még a nagy szoftvergyártók (pl. Oracle) esetében is megesik. Ilyenkor az a teendő, hogy minden lokális repo-ba (vagy cégen belül pl. egy központi maven3 site-ra) fel kell installálni a komponenst.
Erre a két problémára ad elegáns megoldást a Sonatype Nexus .
A Nexus az első esetben úgy fog viselkedni mint egy repó proxy, azaz transparens módon adott kérésre letölti az adott repóból a komponenst, elérhetővé teszi a felhasználó számára, majd a saját munkaterületen lementi ezt a komponenst - az adott repóhoz beregisztrálja. Így, ha legközelebb ilyen kérés történik, akkor nem tölti le, hanem a helyi cache-ből veszi elő.
A másik esetben pedig úgy fog viselkedni mint egy repó, azaz be tudjuk regisztrálni egy webes felületen keresztül a komponenst és innentől kezdve ez is transparens módon elérhető lesz a projektjeink számára.
A pom.xml-be a továbbiakban nem kell megadni a külső repó hivatkozásokat, hanem csak a Nexus-t kell felsorolni mint repó és ennyi.
A Nexus installálása
A Nexus-t többféleképpen lehet installálni. A Nexus letöltési oldaláról két formában tölthető le. Egy előre telepitett verzió tömörítéseként - ebben az esetben egy Jetty web konténer alatt fut. Kezdőknek ideálís. Ki kell csomagolni és csak el kell indítani. Elég részletes leírás kapható itt.
Mi a másik módot választjuk. Letöltjük WAR-ként a Nexus-t, majd egy Apache Tomcat7 webkonténerbe installáljuk és bekonfiguráljuk. Töltsük le a Tomcat7-et és installáljuk a gépünkre. Pl. a c:/apps/tomcat7 alá. Ez lesz a TOMCAT_HOME illetve a CATALINA_HOME környezeti változók értéke a továbbiakban.
Töltsük le a Nexus WAR állományt. Nevezzük át nexus.war -ra az egyszerűség kedvéért. Átnevezés után, másoljuk az állományt a TOMCAT_HOME/webapps alkönyvtárba. Alapértelmezésként a Nexus a munkaterületét a ${user.home}/sonatype-work helyen hozza létre, de ezt természetesen tudjuk szabályozni. Annyira nem jó, ha a felhasználó home könyvtárában kerül az ilyesmi - legalább is az én véleményem szerint - létrehozásra. Ezt úgy tudjuk szabályozni, hogy beállítjuk a PLEXUS_NEXUS_WORK környezeti változó értékét arra könyvtárra, amelyet szeretnénk, hogy a Nexus munkaterülete legyen, pl. legyen ez a c:\apps\nexus-work, azaz PLEXUS_NEXUS_WORK=c:\apps\nexus-work.
Ezek után indítsuk el a tomcat-et, miután elindult, a Nexus elérhető a:
http://localhost:8080/nexus webhelyen.
A Nexus konfigurálása
Ha minden rendben ment, akkor az alábbi képernyőt kell, hogy lássuk:
A bal oldali menüből válasszuk ki a "Repository" linket:
Látható, hogy már alapból jó néhány repó be van konfigurálva, pontosabban 7 repó be van konfigurálva. Nos, ahogy a konfigurációból is látszik, 3 fajta repót különböztetünk meg:
- Virtual - egy más formátumú repót maven2 repóként érhetünk el
- Hosted - a komponensek az adott Nexus szerveren kerülnek installálásra
- Proxy - egy távoli repót proxy-ként történő elérése
Bejelentkezés
A jobb felső sarokban látható a "Log in" menüpont. Kiválasztva megjelenik a bejelentkező ablak. Alapértelmezésként az "admin" felhasználó és "admin123" jelszóval lehet belépni. Ezt később célszerű megváltoztatni.
Hosted repó kezelése
A "Hosted" repó egy olyan repository amelyet tényleg az adott Nexus szerver hosztol. Tehát az állományok "eredetije" itt helyezkedik el. Ez elsősorban akkor jó, ha nekünk kell feltölteni egy-egy komponenst, mert másképpen nem tudunk (vagy nem akarunk) mások számára elérhetővé tenni.
A Nexus alapértelmezettként a következő repókkal hosztolt kerül installálásra:
- 3rd Party - ide kellene kerülnie minden nem általunk készített komponenst amelyet feltöltünk a repóba
- Snapshots - az általunk készítette, a projekt tagok számára elérehtővé tett fejlesztés alatt levő komponensek
- Releases - az általunk készítette, a projekt tagok számára elérehtővé tett véglegesített komponensek
A "Central" kiválasztva láthatjuk a beállításait. A "Configuration" fület választva megtekinthetjük a beállításokat mely alapján könnyedén létrehozhatunk magunk is egy újabb hosztolt repót.
Később, még erre visszatérünk, amikor majd egy új terméket töltünk fel.
Proxy repó létrehozása és kezelése
A proxy repó egy távoli repót képvisel. Megadásával a maven számára transzparensen elérhetővé válik. Amikor a maven3 megszolitja a nexust és kéri a komponenst, akkor a Nexus rákeres, hogy a komponens hol található - ha nincs már eleve letöltve. Ha nincs letöltve és megtalálta valamelyik távoli repóban, akkor azt először letölti majd letölthetővé teszi a kérő fél számára is.
A Nexus alapértelmezésben a következő előre konfigurált proxy repókkal kerül telepítésre:
- Apache Snapshots - a http://repository.apache.org/snapshots/ elérése, elsősorban a fejlesztés alatt levő komponenseket tartalmazza
- Central - a Maven Central repository: http://repo1.maven.org/maven2/
- Codehaus Snapshots - a Codehaus Snapshots repó: http://nexus.codehaus.org/snapshots/
Valamelyiket kiválasztva láthatjuk a beállításokat. Ezt fogjuk leginkább használni. Nézzünk egy egyszerű hozzáadást. A példa kedvéért adjuk hozzá a java.net Maven2-es repository-t. Az ehhez tartozó URL: http://download.java.net/maven/2/
Az új repó hozzáadásáért, válasszuk az "Add" menüpontot a felső menüből, majd a "Proxy Repository" az almenüből, ahogy a képen is látszik:
Az almenüpontot választva, egy új sor jelenik meg a repository-k között: "New Proxy Repository" majd az alsó részben megjelenik egy szerkeszthető felület, melyet majd ki kell töltenünk:
Adjuk meg a következő adatokat:
- Repository ID: java.net-m2
- Repository Name: Java.net M2
- Provider: Maven2
- Repository Policy: Release
- Remote Storage Location: http://download.java.net/maven/2/
A többit hagyjuk alapértelmezésként. Mentsük el:
Ezáltal a Java.Net Maven2 repository komponensei elérhetővé váltak.
Gyakorlás: Gyakorlásként vegyük fel egy szintén gyakran használt repó, az Apache Maven2 repót, melynek linkje: http://repo.maven.apache.org/maven2
Virtual repó létrehozása és kezelése
A virtuális repó egy olyan repót képvisel, mely eredetileg nem Maven2-es formátumnak megfelelő formában tárolja a komponenseket. Pl. ilyen a régebbi Maven1-es formátumú repository-k. Ez azért lényeges, mert így a régi dolgaink sem vesznek el és nem is kell plusz erőforrást pazarolni ezen komponensek Maven2 repóba való beimportálásra.
A Nexus-ba installálás után a Central M1 Shadow van konfigurálva. A kezelése hasonló az előzőekben megismertetekhez.
Komponens feltöltése a Nexus-ba
Ahhoz, hogy egy komponenst feltöltsünk a Nexus-ba, léteznie kell egy olyan repónak, melyet helyileg a Nexus hosztol. Ilyen repó a már bekonfigurált "3rd Party" repó is. A példához ezt fogjuk felhasználni. A példában az Oracle által közétett (http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-11201...) OJDBC Driver-t fogjuk telepíteni a helyi Nexus-ba. A driver komponens teljes neve:
Oracle Database 11g Release 2 (11.2.0.3) JDBC Driver
A letöltött komponens file neve: ojdbc6.jar
Ebben formában ez a komponens alkalmatlan a feltöltésre, mivel nem tartalmazza a verzió információt a fájlnevében. Ezért majd ezt feltöltés előtt át kell nevezzük. Tekintettel, hogy a verziószám: 11.2.0.3, így lehet a fájlnév: ojdbc6-11.2.0.3.jar
A csoport (groupID) illetve az termék (artifactID) azonosítóra is szükségünk lesz. Tekintettel, hogy mi töltjük fel, mi határozhatjuk meg a neveket:
groupID: com.oracle
artifactID: ojdbc6
És ennyi igazából a szükséges információ a feltöltéshez. Lássunk hozzá! A Nexus adminisztrációs felületén válasszuk ki a "3rd Party" repót, majd az alsó menüben válasszuk ki az "Artifact Upload" menüpontot. A választás után megjelenik a szerkesztő felület, ahol ki kell választania legördülőből, hogy most "GAV Parameters" alapján adjuk meg a komponensnek az adatait. Ilyet kell, hogy lássunk:
Utána a megjelenő szerkesztő felületet töltsük ki a következők alapján, illetve válasszuk ki a feltöltendő állományt:
Mielőtt az "Upload Artifact(s)"-ra kattintunk, kattintsunk az "Add Artifact"-ra, ezáltal a feltöltésre szánt állomány felkerül az "Artifacts" listára:
Miután ez meg van, kattintsunk az "Upload Artifact(s)" gombra. Ha minden rendben ment, akkor a rendszer vissza igazol egy eredmény dialógussal, hogy a komponens feltöltésre került.
A művelet sikerességét magunk is ellenőrizhetjük úgy, hogy a feltöltött komponenst kikeressük a "3rd Party" indexében. Az alsó fülekből válasszuk ki a "Browse Index" fület, majd bontsuk ki a komponens hierarchiát és keressük meg az Oracle Driver-t amit éppen feltöltöttünk. A következő eredményt kellene lássuk:
Ezennel sikeresen feltöltöttünk egy új komponenst a Nexus-ba. Már csak a pom.xml-ben való használat van hátra.
Nexus szerver használata a pom.xml -ben
Nos, a helyzet pofon egyszerű. A Nexus szervert ugyanúgy kell felvenni, mint bármi más repót. Egyedül az URL az ami elsőre talán nem egyértelmű. Ahhoz, hogy a Nexusról szedjen mindent a maven, töröljük a repó bejegyzéseket a pom.xml-ből, és csak a következőt adjuk meg:
Mielőtt még végrehajtanánk a tesztet, ellenőrizzük, hogy az Apache Maven2 Proxy repó létezik-e a Nexus-ba, ha nem vegyük fel (az URL: http://repo.maven.apache.org/maven2).
Menjünk a $MAVEN_REPOSITORY alkönyvtárba, és töröljük annak tartalmát. Így elégé látványos lesz, hogy mindent a Nexus-ból fog a maven letölteni.
Ha meg volt a törlés, akkor adjuk ki a rendezes projektünkben a:
mvn clean install
parancsokat, és ellenőrizzük az eredményt :)
Valami ilyet kellene látnunk:
...
Tükörszerver beállítása a settings.xml -be
Nyissuk meg a ${user_home}/.m2/settings.xml állományt. Keressük meg a <mirrors></mirrors> bejegyzéseket, és egészítsük ki a következőképpen:
Ezzel azt mondtuk meg, hogy a Central repónak a tükörképe az általunk használt Nexus. Így, csak akkor fog közvetlenül a Central repóhoz fordulni a Maven, ha a Nexus-unk nem elérhető.
Most ismételjük meg az előző tesztet (töröljük a lokális repó tartalmát)! A következőket kellene látnunk:
Tehát, MINDEN a Nexus-on keresztülmegy!
Ha a fentiekkel kérdések merülnek fel, kérem keressetek a magyar@mail.thot-soft.com e-mail címen.
Hasznos olvasnivaló:
- Repository Management with Nexus: http://www.sonatype.com/index.php/Support/Books/Repository-Management-wi...