2009-09-01 12 views
7

I zdefiniowano lokalnego serwera dla wszystkich repozytoriów w pliku settings.xml:Maven nie zastępuje zmienną w „settings.xml”, gdy jest wywoływana

<mirror> 
    <id>myMirror</id> 
    <mirrorOf>*</mirrorOf> 
    <url>file://${mypath}/maven/.m2/repository</url> 
</mirror> 

chcę, że moje lustro, aby wskazywała ścieżka lokalna, w tym przypadku ścieżka jest:

file://${mypath}/maven/.m2/repository 

Gdzie $ {mojasciezka} jest zmienną, która mijam kiedy powoływać Maven:

mvn -Dmypath="/D:/test" package 

Problem polega na tym, że Maven nie zastępuje zmiennej po jej wywołaniu. Widzę, że ten błąd występuje w wyniku inspekcji dziennika kompilacji. Na przykład Maven zgłasza, że ​​pobiera plik z pliku: // $ {mypath} /maven/.m2/repository, gdy poprawny będzie plik: /// D: /test/maven/.m2/repository.

Mam również zauważyć, że Maven zastępuje poprawnie mojego zmiennej po włożeniu w tagu url dziecięcej repozytorium tagu:

<repository> 
     <id>central</id> 
     <url>http://${mypath}/maven/.m2/repository</url> 
</repository> 

Kompilacja działa poprawnie, gdy zastąpić zmiennej w moim settings.xml przez pełny adres URL, jak w poniższym przykładzie:

<mirror> 
     <id>myMirror</id> 
     <mirrorOf>*</mirrorOf> 
     <url>file:///D:test/maven/.m2/repository</url> 
</mirror> 

Odpowiedz

11

Zastąpienie właściwości w pliku settings.xml nie działa tak, jak można się spodziewać.

Zastąpi one właściwości wewnątrz elementu profile (tak jak widzieliście to zamienniki w urlinie repozytorium, który zostanie zdefiniowany wewnątrz profilu), ale nie na elementach poza profilami (jak widzieliście w sekcja lusterek). Ta distinction została utworzona, ponieważ element profilu w pliku settings.xml jest skróconą wersją elementu profilu pom.xml. Jest to mechanizm pozwalający na ustawienie konfiguracji w POM, więc podstawienie właściwości jest dozwolone w elementach profili, ponieważ są one faktycznie częścią POM.

Części ustawień poza elementem profile reprezentują konfigurację platformy, nie mają na nią wpływu indywidualne kompilacje, więc nie zastępują właściwości wiersza polecenia. Ma to sens, ale nigdzie nie jest jasne.

EDIT: w the settings page dokumentacji Mavens, w ostatnim zdaniu szybkiej sekcji Przegląd (całkiem ukryty) stwierdza:

Należy pamiętać, że właściwości zdefiniowane w profilach w settings.xml nie może być użyty do interpolacji.


Istnieje obejście chociaż można zastąpić zmiennymi środowisku do settings.xml.Jeżeli ustawić zmienną środowiskową:

set M2_MIRROR=D:\test 

i skonfigurować repozytorium URL następująco:

<url>file://${M2_MIRROR}/maven/.m2/repository</url> 

Następnie wywołać maven jako normalne, zmienna środowiskowa jest podstawiony i Twój kompilacji powinny działać jako wymagane.

+1

Czy to nie powinno być '$ {env.M2_MIRROR}'. – OrangeDog

0

prawdopodobnie jest to błąd - niestety wymiana nieruchomość nie wydaje się być spójne wtyczek Maven. Napotkałem błąd samodzielnie określając więcej niż dwie właściwości w elemencie konfiguracji w innej wtyczce.

1

Plik settings.xml nie jest interpolowany tak jak pom, więc nie można użyć tej właściwości, jak pokazano powyżej.

+0

Tak, może. Jak już wspomniałem w pytaniu, udało mi się wstawić zmienną do tagu url zagnieżdżonego w znaczniku repozytorium. Zauważ, że ten znacznik repozytorium, o którym wspomniałem, znajduje się wewnątrz pliku "settings.xml", a nie wewnątrz pliku pom. –

+0

Przepraszam, źle odczytałem. Część profilu jest interpolowana, ale nie wszystkie ustawienia "bazowe", na przykład, nie działa dobrze, jeśli spróbujesz użyć właściwości do lokalnego repozytorium. –

+0

Jest to poprawne, ale z twojej odpowiedzi nie wynika jednoznacznie, dlaczego nie możesz ustawić właściwości poza elementem profiles, próbowałem rozwinąć moją odpowiedzią. –

2

Jest to stary pytanie teraz, ale jak Maven 3, i prawdopodobnie wcześniej, można zwrócić się do środowiska Vars, jeśli prefiks z 'env'

zrobić tak jak poniżej:

<localRepository>${env.M2_LOCAL_REPO}</localRepository> 

Następnie każdy programista ustawia M2_LOCAL_REPO w odpowiednie miejsce.

Powiązane problemy