2013-10-15 13 views
6

Mam system składający się z wielu aplikacji internetowych (wojna) i bibliotek (jar). Wszyscy oni używają maven i są pod moją kontrolą (kod źródłowy, wbudowane artefakty w Nexusie, ...). Powiedzmy, że aplikacja A używa biblioteki L1 bezpośrednio i L2 pośrednio (jest używana z L1). Mogę z łatwością sprawdzić topologię drzewa zależności od aplikacji, używając zależności maven: tree lub graph: project plugins. Ale jak mogę sprawdzić, kto korzysta z mojej biblioteki? Z mojego przykładu chcę wiedzieć, czy A jest jedyną aplikacją (lub biblioteką) używającą L1 i że L2 jest używana z L1 iz jakiejś innej aplikacji, powiedzmy B. Czy jest jakaś wtyczka dla maven lub nexusa, czy powinienem spróbować? napisać o tym jakiś skrypt? Jakie są twoje sugestie?Kto używa mojego artefaktu maven?

+1

Byłoby to bardzo przydatne, potrzebowałem tej funkcji wiele razy :-) Niestety, nie wierzę, aby takie coś mogło istnieć. Może jakieś narzędzie, które skanuje projekty w twojej przestrzeni roboczej, ale jak to możliwe, że wie, jakie projekty, żyjąc własnym życiem poza twoją domeną, używają tego ... – alterfox

Odpowiedz

4

Jeśli chcesz to osiągnąć na poziomie repozytorium Apache Archiva ma „wykorzystywane przez” funkcji wymienionych w informacji o projekcie

See screenshot.

Jest to podobne do tego, co mvnrepository.com wyświetla w sekcji "używane przez" opisu artefaktu.

Niestety, Nexus nie zapewnia podobnej funkcji.

Teraz przypuszczam, że byłoby kłopotliwe utrzymanie kolejnego repozytorium tylko po to, ale wtedy prawdopodobnie byłoby łatwiej niż inne sugestie dotyczące odpowiedzi, takie jak pisanie wtyczki do Nexusa. Wierzę, że Archiva może być skonfigurowany do pośredniczenia w innych repozytoriach.

Aktualizacja

W rzeczywistości, istnieje również plugin for Nexus aby osiągnąć „używany przez” funkcji.

+0

+1: Dokładnie tego szukam, niestety nie dla Nexusa. – Kojotak

+0

Zaktualizowałem odpowiedź. Zdecydowanie sprawdź tę wtyczkę. – Boj

+0

Ta wtyczka wygląda bardzo interesująco. Sprawdzę to również ... –

2

Nie sądzę, że istnieje sposób Maven, aby to zrobić. Biorąc to pod uwagę, istnieją sposoby robienia tego lub podobnych rzeczy. Oto kilka przykładów:

  • Otwórz swoje projekty w swoim ulubionym IDE. Na przykład Eclipse pomoże ci w analizie wpływu na poziomie klasy, która przez większość czasu może być wystarczająco dobra.

  • Użyj prostego "grep" w swoim katalogu źródłowym. To brzmi brusk bitowy (a także rzeczy oczywiste), być może, ale używaliśmy to dużo

  • Korzystanie z zależnościami narzędzia analityczne, takie jak Sonargraph lub Lattix

3

O ile wiem, nic poza tym nie istnieje jako narzędzie open source. Możesz napisać wtyczkę Nexusa, która przemierza repozytorium i sprawdza użycie komponentu we wszystkich innych komponentach, wykonując iteracje przez wszystkie pom i analizując je. Byłoby to jednak dość trudne zadanie, ponieważ musiałoby patrzeć na wszystkie komponenty i analizować wszystkie poms.

W podobny sposób można to zrobić w lokalnym repozytorium za pomocą innego narzędzia. Jednak prawdopodobnie bardziej sensowne jest analizowanie zawartości menedżera repo, a nie lokalnego repozytorium.

1

Bardziej interesujące jest prawdopodobnie: co zrobiłbyś z tymi informacjami? Poinformuj twórców A, aby nie używali już biblioteki L1 lub L2, ponieważ ma ona krytyczny błąd? Moim zdaniem powinieneś być w stanie stworzyć czarną listę zależności/rodziców/wtyczek w twoim menedżerze repozytorium. Gdy projekt spróbuje wdrożyć/przesłać samodzielnie z artefaktem umieszczonym na czarnej liście, powinien zawieść. Mówię: uploading, a nie downloading, ponieważ może to zepsuć wiele projektów. O ile mi wiadomo, nie jest to jeszcze dostępne dla żadnego menedżera repozytorium.

+0

Sonatype CLM robi to właśnie dzięki integracji inscenizacji Nexusa i Zasady CLM. Ma również integrację z Jenkins/Hudson i Eclipse, dzięki czemu możesz się nie powieść kompilacje lub jako deweloper sprawdzać twoje komponenty. –

+0

Byłem świadomy możliwości z rozszerzeniami, ale nie gotowym do użycia rozwiązaniem. Dzięki. –

+0

Użyłbym tych informacji do refaktoryzacji i testowania. Jeśli naprawiłem błąd w jednej bibliotece, która aplikacja powinna zostać przetestowana? Jeśli jedna biblioteka (lub metoda/klasa/pakiet z biblioteki) staje się przestarzała, które aplikacje (i inne biblioteki) powinny być refaktoryzowane? Tak, istnieją testy jednostkowe i integracyjne, które wychwytują największe niekompatybilne zmiany, ale nie zawsze są wystarczające. – Kojotak

1

Jednym ze sposobów podejścia do tego problemu jest poza samą Javą: napisać skrypt monitorujący na poziomie OS, który śledzi każdy przypadek fopen() w podanym pliku jar! Zakładając, że jest to w środowisku korporacyjnym, być może będziesz musiał poczekać kilka tygodni (!), Aby wszystkie używane procesy mogły uzyskać dostęp do biblioteki przynajmniej raz!

W systemie Windows można użyć Sysinternals Process Monitor, aby to zrobić: http://technet.microsoft.com/en-us/sysinternals/bb896645

Na Unix wariantów, należy użyć DTrace lub strace.

2

Nie znam żadnych bibliotek publicznych do tej pracy, więc napisałem dostosowaną aplikację, która robi to za mnie. Pracuję z dystrybucją, która obejmuje ponad 70 połączonych artefaktów. Wiele razy po zmodyfikowaniu artefaktu chcę zapewnić, że zmiany są zgodne z wcześniejszymi wersjami (tzn. Nie są wprowadzane błędy kompilacji w zależnych artefaktach). Aby to osiągnąć, kluczowe było poznanie wszystkich osób zależnych od zmodyfikowanego artefaktu.

Dlatego napisałem aplikację, która skanuje wszystkie artefakty w katalogu (/ podkatalogach), wyodrębnia ich pom.xml i przeszukuje (w sekcji zależności pom) dla wystąpienia zmodyfikowanego artefaktu. (Zrobiłem to w Javie, chociaż skrypt powłoki/okna może to zrobić jeszcze bardziej zwięźle.)

Chętnie udostępnię kod na github, jeśli to mogłoby być pomocne.

+0

To byłby świetny pomysł! – Kojotak

+0

@Kojotak - Kod hostowany jest w lokalizacji git: https://github.com/ShrutiTiwari/artifacto Główna klasa: JarInspector. Metoda main() znajduje wszystkie artefakty w zależności od "junit" i "aether" w bibliotece "apache-maven-3.0.4". Testowany w oknach (mam nadzieję, że zadziała na Linuksie bez zmian). Podejście to ma jednak jedną wadę - nie przechwytuje zależności przechodnich. –

+0

Hej Kojotak! czy znalazłeś przydatny do tego celu Gitcode (Daj mi znać, jeśli utkniesz podczas używania). Zmodyfikowałem go tak, aby akceptował wejścia linii poleceń, np. w celu sprawdzenia artefaktów-biblioteki-dystrybucji w zależności od junit, polecenie będzie: java -jar artifacto-1.0.0-SNAPSHOT.jar C: \ software \ installation \ build-tools \ apache-maven-3.0.4 \ lib \t junit –

2

Jednym ze sposobów, który może odpowiadać Twoim potrzebom, jest stworzenie mistrzowskiego pom z wszystkimi swoimi maven projektów. Następnie uruchom następujące polecenie na pom-pom:

mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml 

Otwórz wygenerowany plik w YEd.

Używane instrukcje znaleźć tutaj: http://www.summa-tech.com/blog/2011/04/12/a-visual-maven-dependency-tree-view/

+0

Próbowałem master pom uzależnione tylko od aplikacji, ale ponieważ są one pakowane jako wojna, przejściowe zależności od bibliotek (słoiki) nie zostały uwzględnione. Nie mogę po prostu utworzyć jednego głównego pom zależnego od wszystkich projektów (aplikacji i bibliotek), ponieważ różne wersje tej samej biblioteki są używane przez różne aplikacje i mają różne zależności. – Kojotak

+0

Uruchomiłem polecenie maven z powodzeniem. Ale otrzymuję wyjątek podczas próby otwarcia pliku outputFile w yed: yEd napotkał następujący błąd: Nie można zaimportować pliku dependency.graphml. Powodowane przez: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Treść nie jest dozwolona w prologu. \t na com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (DOMParser.java:251) –

1

IMHO, a także z mojego doświadczenia, szuka rozwiązania techniczne dla takiego problemu często jest przesadą. Jeśli powód, dla którego chcesz wiedzieć, kto używa twojego artefaktu (biblioteki), to dlatego, że chcesz zapewnić kompatybilność wsteczną, gdy zmieniasz artefakt lub coś podobnego, myślę, że najlepiej zrobić to, komunikując swoje zmiany za pomocą tradycyjnych kanałów, a także zachęcić innych zespoły, które mogą używać twojej biblioteki, aby o tym porozmawiać (blogi projektu, wiki, e-mail, dobrze znana lokalizacja, gdzie umieszczane są dokumentacje, Jour fixe itd.).

Teoretycznie można napisać skrypt, który przeszukuje każdy projekt w repozytorium, a następnie analizuje maven build.xml (zakładając, że wszyscy używają maven) i sprawdza, czy zdefiniowali zależność od artefaktu. Jeśli wszystkie projekty w twojej organizacji będą zgodne ze standardową strukturą maven, powinno być łatwo napisać jeden taki skrypt (chociaż jeśli któryś z tych projektów ma zależność od twojego artefaktu przez przejściową zależność, sprawy mogą być nieco bardziej skomplikowane).

Powiązane problemy