blog.grejpfrut.org

M2: zdalne repozytorium

without comments

Zarządzanie zależnościami w m2 opisałem już szczątkowo w poprzednich postach, dokładny opis z przykładami możecie znaleźć na tej stronie.

struktura repozytorium Maven

struktura repozytorium Maven

W tym poście chciałbym krótko omówić strukturę repozytorium m2, mimo istnienia kilku centralnych, dużych repozytoriów warto dla swojego projektu stworzyć własne. Powodów po temu może być kilka:

  • nasz projekt używa bibliotek których na ibiblio.org próżno szukać (np. jakiś zapomniany projekt studencki :) )
  • stworzenie repozytorium na projektowym serwerze przypuszczalnie znacznie przyspieszy download artefaktów (ibiblio bywa obciążone)
  • w przypadku awarii centralnego repozytorium (co miało jakiś czas temu miejsce :) ) możemy spokojnie dalej pracować

Czego potrzeba zeby stworzyc repozytorium maven2? Naprawde niewiele: trochę miejsca na serwerze, potrzebujemy katalog dostępny (dajacy sie wylistować) z www. Teraz trzeba wrzucić jar’y i pliki pom tak aby były zgodne z ustalona struktura katalogow. Korzeń zaprezentowanego poniżej systemu plików (lucene) to groupId zależności, na groupId nie musi się składać tylko jeden poziom katalogów (w przypadku lucene wygląda to tak: org/apache/lucene/lucene-core). Lucene-core to nazwa artefaktu, na poziomie niżej znajdują się konkretne wersje. Każdy artefakt musi mieć dołączoną sumę kontrolną w plikach md5, sha1. Każdy czyli: pom, jar i wszystko inne (xml). Co zresztą widać na powyższym obrazku.

Dwa słowa o plikach metadanych, w katalogu głównym wyglądać on może tak:

  <metadata>
     <groupId>lucene</groupId>
     <artifactId>lucene-core</artifactId>
     <version>2.0.0</version>
     <versioning>
  	   <versions>
            <version>2.0.0</version>
            <version>1.9.1</version>
           </versions>
     </versioning>
   </metadata>

w katalogu wersji troche inaczej:

   <metadata>
     <groupId>lucene</groupId>
     <artifactId>lucene-core</artifactId>
     <version>2.0.0</version>
   </metadata>

W m2 można zadeklarować zakres zależności, w polu version artefaktu wpisujemy np. [1.2,1.3] co oznacza, że nasz projekt będzie działać z wersjami 1.2 lub 1.3. Domyślnie m2 zaciągnie najnowszą wersje biblioteki, ale gdyby któraś z zależności przechodnich określała w swoim pom’ie, że z najnowszą wersją nie poleci m2 wybierze tą z która działać będzie wszystko. (więcej tu)Padło magiczne hasło… zależności przechodnie! grr.. Każdy pewnie kiedyś gdzieś zobaczył ClassNotFoundException :) , dodaliśmy do naszego projektu bibliotekę, a po uruchomieniu zamiast efektów widzimy wyjątki. M2 oferuje swój całkiem sprawny mechanizm zawiadywania zależnościami przechodnimi dzięki temu, że do każdego projektu w repo dołączany jest pom z opisem zależności każdego projektu, m2 może podczas ściągania zależności przejrzeć sobie je i dodać zależności zależności :) .

Podsumowując musimy stworzyć odpowiednią strukturę katalogów, dodać pliki metadanych, dołączyć do tego wszystkiego sumy kontrolne i wrzucić na serwer. Wbrew pozorom jest trochę z tym roboty, istnieje wtyczka repository która udostępnia polecenie bundle-create. Nie użyłem jej nigdy, wymaga ona wypełnienia w pom.xml takich rzeczy jak scm, licencja (opis tutaj). Strukturę katalogów tworzę więc ręcznie a do podpisywania plików stworzyłem sobie prosty plik ant’owy (gdyby ktoś znał jakiś prostszy sposób, to dajcie znać :) )

Gdy stworzymy już nasze projektowe repozytorium musimy jeszcze dodać jedną rzecz w pom.xml projektu:

    <repositories>
       <repository>
         <id>our-project-repo</id>
         <name>Our project repo</name>
         <url>http://our.project.org/maven_repo</url>
       </repository>
     </repositories>

To w zasadzie wszystko, jest jeszcze jedna ciekawostka :) w m2 można też używać repozytoriów m1.x. Zauważyłem to dopiero przy przeglądaniu referencji do pom.xml. W sekcji repository jest możliwość wyspecyfikowania tag’a layout możemy mu przypisać wartość default albo legacy. Stosunkowo prościej stworzyć repo w starym formacie (nie ma sum kontrolnych, plików metadanych), ale też takie repo nie obsłuży przechodnich zależności czy zakresów wersji. Coś za coś :) .

Written by admin

Maj 5th, 2006 at 11:51 pm

Posted in java, po polsku

Tagged with

Leave a Reply