2010-01-26 18 views
10

W moim projekcie istnieje wiele zależności, które są przejściowo zawarte w innych zależnościach, które nie mają plików pom.xml dostępnych w żadnym z naszych repozytoriów korporacyjnych. Są to wewnętrzne biblioteki przeznaczone wyłącznie dla słoików, obsługiwane przez różne zespoły, które zostały załadowane do repozytoriów dla wygody od zespołów spoza Maven, ale te repozytoriom niestety nie są moje.Jak powstrzymać Mavena 2.x przed próbą pobrania nieistniejącego pliku pom.xml dla zależności w każdej kompilacji?

W przypadku tych zależności Maven nalega na próbę pobrania poms z każdej mojej listy repozytoriów za każdym razem, gdy uruchamiam kompilację lub mvn dependency:list. Oznacza to, że maven próbuje odzyskać 8x pom plików z 7 różnych lokalizacji repozytorium i biorąc pod uwagę, że jest to ponad globalną siecią WAN; jest naprawdę powolny.

np. dla jednego konkretnego uzależnienia

C:\Working\dev\workspace\project>mvn dependency:list 
[INFO] Scanning for projects... 
[INFO] Searching repository for plugin with prefix: 'dependency'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building project 
[INFO] task-segment: [dependency:list] 
[INFO] ------------------------------------------------------------------------ 
[WARNING] Unable to get resource 'aGroupId:anArtifactId:pom:4.0.14i' from repository inhouse (http://someRepo1/proximity/repository/inhouse): While configuring wagon for 'inhouse': Unable to apply wagon configuration. 
Downloading: http://someRepo1/proximity/repository/extFree/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository extFree (http://someRepo1/proximity/repository/extFree) 
Downloading: http://someRepo1/proximity/repository/externalNonFree/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository extNonFree (http://someRepo1/proximity/repository/externalNonFree) 
Downloading: http://someRepo2/efs/dist/maven/maven2-repository/incr/common/lib/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository efsRepo (http://someRepo2/efs/dist/maven/maven2-repository/incr/common/lib) 
Downloading: http://someRepo2/efs/dist/btijava/maven2-repository/incr/common/lib/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository efsBTI (http://someRepo2/efs/dist/btijava/maven2-repository/incr/common/lib) 
Downloading: http://someRepo3/maven/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository internal.repo (http://someRepo3/maven) 
Downloading: http://repo1.maven.org/maven2/aGroupId/anArtifactId/4.0.14i/anArtifactId-4.0.14i.pom 
[INFO] Unable to find resource 'aGroupId:anArtifactId:pom:4.0.14i' in repository central (http://repo1.maven.org/maven2)` 
... 
etc 
... 
[INFO] [dependency:list {execution: default-cli}] 
[INFO] 
[INFO] The following files have been resolved: 
... etc 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 20 seconds 
[INFO] Finished at: Tue Jan 26 15:01:48 CST 2010 
[INFO] Final Memory: 31M/74M 
[INFO] ------------------------------------------------------------------------ 

Z drugiej strony, dla POM, które są po prostu nieważne (starszy modelVersion lub uszkodzony/niepoprawny XML, na przykład), to po prostu sprawdza moje lokalnego repo, skarży się, że to nieważne, a następnie kontynuuje. Co jest w porządku; przynajmniej to nie próbuje ponownie przez WAN.

Czy istnieje sposób (ustawienie, przesłonięcie, zmiana konfiguracji repozytorium) Mogę zapobiec sytuacji, w której Maven's dependency plugin/artifact resolvera wielokrotnie próbuje zlokalizować brakujące POM, jeśli ma już plik jar w lokalnym repo?

Specyfikacja: Maven 2.2.1 (domyślne definicje plugin superPOM) JDK 1.6.0_18

Odpowiedz

9

Odpowiedź Pascala jest poprawna dla dwóch lokalnych obejść kompilacji. Jednak najlepszym rozwiązaniem jest zwrócenie się do właścicieli tych projektów o utworzenie POM dla artefaktów. Oni nie muszą być skomplikowane, prosta alternatywa Maven używa wewnętrznie zadziała:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>aGroupId</groupId> 
    <artifactId>aArtifactId</artifactId> 
    <version>4.0.14i</version> 
</project> 
+0

Miałem nadzieję, że nie będę musiał włóczyć się po korporacji, szukając właścicieli wszystkich artefaktów. Ale jeśli naprawdę nie ma sposobu na zmianę tej części zachowania Mavena, myślę, że będę musiał to zrobić. Po prostu wydaje mi się dziwne, że Maven zaakceptuje uszkodzone/niekompatybilne lokalne POM na repo bez próby odzyskania go ponownie, ale nieistniejący będzie próbował na zawsze, nawet jeśli uda mu się odzyskać słoik. – Chad

+0

Użyłem tej pracy i sprawdziło się to dla mnie. Próbowałem ustawić limity czasu na różnych repozytoriach bez powodzenia. – jtruelove

+2

Wow, to Brett Porter z zespołu Maven! –

4

Pobieranie POM jest naprawdę centralne pojęcie w Maven wspierać przechodnie zależnościami (faktycznie, zależność nie tylko JAR, patrz 3.5.5. Maven's Dependency Management po szczegóły), więc nie wiem, czy możesz temu zapobiec.

Oczywiście, właściwym rozwiązaniem byłoby naprawienie głównej przyczyny problemu. Ale jeśli nie możesz, możesz uruchomić kompilację w trybie offline (używając opcji -o). A może po prostu "zainstalujesz" artefakty w lokalnym repozytorium za pomocą install:install-file i poinstruujesz wtyczkę, aby wygenerowała pom dla nich używając opcjonalnego parametru generatePom (ale to oczywiście nie "naprawdę" skaluje).

+0

Dzięki Pascal. Tak, rozumiem, że to centralna koncepcja, ale niestety, jak to często bywa w (celowo) zastraszonych korporacjach, nie mam żadnej kontroli nad ich repozytorium Maven, ale znowu muszę mieć możliwość pobrania artefaktów kompilacji.W przypadku niektórych zależności nie jest nawet jasne, kto jest za nie odpowiedzialny, więc trudno wiedzieć, kogo zapytać! Jeśli inni eksperci doszli do takiego samego wniosku, że nie ma sposobu, aby to zrobić, to dobrze - przynajmniej wiem, że nie jestem szalony. I tak, lokalne hacki nie są tak naprawdę optymalne z powodów skalowalności, o których panu chodzi. – Chad

2

Skonfiguruj Nexus repozytorium (lub podobny) i wgrać tam artefakty. Nexus automatycznie utworzy podstawowe poms dla przesłanych artefaktów.

+0

To jest rozwiązanie, którego użyłem po prostu w przypadku grupy sonatype-flex, która nie ma pomsów na projekcie halo. Stwórz prosty pom, który następnie zastosowałem do repozytorium "3rd party releases" w Nexusie. Kompilacje następnie kontynuują się całkiem szczęśliwie, a w "publicznym" repozytorium agregującym nigdy nie wiesz, że pom i swc pochodzą z różnych repozytoriów wewnętrznych/proxy. –

-1
  • pobieranie do lokalnego repo
  • setup nexus i przesłać
  • praca nieaktywny

może najlepszym pomysłem jest, aby pozbyć Maven całą drogę, to jest horror!

Powiązane problemy