2017-05-31 9 views
5

Mam przekierowanie wszystkich maven repozytorium dostęp do Artifactory z następującym ~/.m2/settings.xml:Jak uzyskać wszystkie zdalne repozytoria hierarchii projektów?

<?xml version="1.0" encoding="UTF-8"?> 
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<!-- unclear what version changes -> use 1.1.0 because it's higher --> 
    <servers> 
    <server> 
     <id>central</id> 
     <username>admin</username> 
    </server> 
    <server> 
     <id>snapshots</id> 
     <username>admin</username> 
    </server> 
    </servers> 
    <mirrors> 
    <mirror> 
     <id>artifactory</id> 
     <name>artifactory</name> 
     <mirrorOf>*</mirrorOf> 
     <url>https://[hostname]:[port]/artifactory/remote-repos/</url> 
    </mirror> 
    </mirrors> 
    <profiles> 
    <profile> 
     <id>artifactory</id> 
     <repositories> 
     <repository> 
      <id>central</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots> 
      <enabled>false</enabled> 
      <updatePolicy>interval:25200</updatePolicy> 
      </snapshots> 
     </repository> 
     <repository> 
      <id>snapshots</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots /> 
     </repository> 
     </repositories> 
     <pluginRepositories> 
     <pluginRepository> 
      <id>central</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots> 
      <enabled>false</enabled> 
      <updatePolicy>interval:25200</updatePolicy> 
      </snapshots> 
     </pluginRepository> 
     <pluginRepository> 
      <id>snapshots</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots /> 
     </pluginRepository> 
     </pluginRepositories> 
    </profile> 
    </profiles> 
    <activeProfiles> 
    <activeProfile>artifactory</activeProfile> 
    </activeProfiles> 
</settings> 

a więc trzeba dodać dodatkowe zdalnymi repozytoriami, które są określone przez projekt (i jego projektów dziecko) do Artifactory instancji. Używam obecnie

find . -name pom.xml -exec grep -B 5 -C 5 '<repository>' {} + 

który nie jest bardzo przydatna w przypadku, gdy adres URL jest zmienna i zadeklarowane w innym miejscu i nie pominąć duplikaty. To nie jest najgorsza rzecz na świecie, ale być może jest dostępna poprawa.

Następujące nie działa:

  • mvn versions:display-dependency-updates nie wyświetla zdalnych repozytoriów
  • mvn dependency:list-repositories działa tylko dopóki pierwsza zależność nie może być pobierany w przypadku pełnomocnika jest włączone tak, że mam do figury gdzie można otrzymać go z badanych dodać zdalne repozytorium do Artifactory lub przenieść ~/.m2/settings.xml bok - mniej przydatny niż polecenia find powyżej

SHO rozwiązanie Działają rekurencyjnie, tzn. zawierają wszystkie repozytoria we wszystkich projektach potomnych i projektach potomnych dla dzieci, itp.

Ma to sens, że rozwiązania nie wymagają pobierania zależności bezpośrednio ze zdalnego repozytorium bez pośrednika, ponieważ Chciałbym je natychmiast przekazać za pośrednictwem proxy Maven - nie jest to jednak wymagane.

+0

Niektóre z repozytoriów mogłyby zostać uznane w zależności. To sprawi, że pobierzesz te zależności, aby znaleźć wszystkie potrzebne repozytoriom. –

+0

@StanislavBashkyrtsev Nie rozumiem, co masz na myśli przez "Niektóre repozytoriów można zadeklarować w zależnościach" (sekcja "zależności" POM?) . –

+0

Masz zależność. Zależność ma swoją pom. W tej pom możesz mieć sekcję repozytoriów. Aby wiedzieć, że musisz najpierw pobrać tę zależność. –

Odpowiedz

1

Nieco hacky podejście mogłoby być te dwa kroki:

  1. Get skuteczne POM. Zauważ, że poniższy cel generuje plik XML zawierający wszystkie POM od razu. Jednak nazwy zmiennych zostaną już rozstrzygnięte.

    mvn help:effective-pom -Doutput="effective-pom.xml" 
    
  2. Przetwarza plik wynikowy XML i zebrać repozytoriów, na przykład, przy użyciu skryptu Python gather-repos.py.

    #!/usr/bin/python 
    
    import sys, xml.etree.ElementTree as ET 
    root = ET.parse('effective-pom.xml').getroot() 
    repositories = dict() 
    for node in root.iter('{http://maven.apache.org/POM/4.0.0}repository'): 
        repo_id = node.findtext('{http://maven.apache.org/POM/4.0.0}id') 
        repositories[repo_id] = node 
    for node in repositories.itervalues(): 
        ET.ElementTree(node).write(sys.stdout, default_namespace='http://maven.apache.org/POM/4.0.0') 
    

Oczywiście skrypt można następnie uruchomić poprzez

chmod +x gather-repos.py 
./gather-repos.py 
+0

Wygląda jak dobre (choć hacky - zgadzam się) rozwiązanie :) 'ET.parse ('tmp')' jest prawdopodobnie 'ET.parse ('effective-pom.xml ') 'i byłoby miło, gdyby działało rekursywnie, co nie wydaje się tak daleko, jak testowałem (z https://github.com/javaee/glassfish) - wspomniałem tylko, że problem dotyczy dziecka również projekty, więc teraz wyjaśniłem, że rozwiązanie powinno działać rekurencyjnie. –

+0

Musi to być 'effective-pom.xml', absolutnie. :) Więc rekursywnie pod względem zależności? Być może skrypt można rozszerzyć, aby działał rekursywnie na POMs w lokalnym repozytorium Maven. Jeśli poprawnie zrozumiem Twój komentarz dotyczący 'dependency: list-repozytoriów', wtyczka' dependency' nie będzie w stanie rozwiązać wszystkich zależności, tak więc chodzenie wykresu zależności musi być wykonane "ręcznie". –

+0

'Zależność' repositories list' nie działa tylko wtedy, gdy proxy jest włączony (w 'settings.xml', jak pokazano powyżej) –

Powiązane problemy