M2: zdalne repozytorium
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.
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ś
.
