User login

Error message

  • Deprecated function: Function create_function() is deprecated in eval() (line 1 of /var/www/thot-soft.com/web/modules/php/php.module(80) : eval()'d code).
  • Notice: Undefined offset: 1 in nice_menus_block_view() (line 306 of /var/www/thot-soft.com/web/sites/all/modules/nice_menus/nice_menus.module).

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:

SonatypeNexus kezdő képernyő

 

A bal oldali menüből válasszuk ki a "Repository" linket:

Nexus Repositories képernyő

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.

Central hosztolt repó

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:

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:

Új repó hozzáadása

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:

A többit hagyjuk alapértelmezésként. Mentsük el:

Java.net Maven2 Repository konfigurációja

 

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:

Komponens feltöltés

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:

Komponens feltöltés

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:

Komponens feltöltése

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:

Egy repó indexének böngészése

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:

 

<repository>
  <id>my.nexus</id>
  <name>My Nexus</name>
  <releases>
    <enabled>true</enabled>
  </releases>
  <snapshots>
    <enabled>true</enabled>
  </snapshots>
</repository>

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:

...

 

[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ rendezes ---
...
 
Az rögtön feltűnik, hogy nem minden jön a Nexus-ból, hanem még mindig a Central repóból is jönnek letöltések, ami annyiban nem jó, hogy felesleges hálózati forgalmat okoz, mivel minden egyes felhasználónál a Central-ból töltődnek le a komponensek és nem a Nexus-ból.
Hogy elérjük azt, hogy mégiscsak a Nexus-ból töltődjön le minden, egy kis trükközésre lesz szükség. Nevezetesen, be kell állítanunk egy tükör (Mirror) szerver definíciót a Centra repóra, amely a mi Nexus szerverünkre fog mutatni.
 

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:

 

  <mirrors>
    <mirror>
      <id>central</id>
      <mirrorOf>central</mirrorOf>
      <name>Maven central repository proxy</name>
    </mirror>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
    </mirror>
     -->
  </mirrors>
 

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:

 

c:\work\rendezes>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building rendezes 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom
Downloaded: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom (5 KB at 4.6 KB/sec)
Downloading: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/plugins/maven-plugins/18/maven-plugins-18.pom
Downloaded: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/plugins/maven-plugins/18/maven-plugins-18.pom (13 KB at 40.1 KB/sec)
Downloading: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/maven-parent/16/maven-parent-16.pom
Downloaded: http://localhost:8080/nexus/content/repositories/central/org/apache/maven/maven-parent/16/maven-parent-16.pom (23 KB at 53.3 KB/sec)
...

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ó:

Hungarian

Blog Authors

Blog History